悦览树

iSO底层原理 - Block的本质

2017-08-21  本文已影响0人  南城同學
Block的本质:

Block的数据结构
Block的数据结构
block的变量捕获(capture)
局部变量
        // auto:自动变量,离开作用域就销毁
        //默认就是auto
        auto int age = 10; 
        static int height = 10;
        void (^block)(void) = ^{
            // age的值捕获进来(capture)
            NSLog(@"age is %d, height is %d", age, height);
        };
        age = 20;
        height = 20;
        block();
struct __test_block_impl_0 {
  struct __block_impl impl;
  struct __test_block_desc_0* Desc;
  int age;
  int *height;
  __test_block_impl_0(void *fp, struct __test_block_desc_0 *desc, int _age, int *_height, int flags=0) : age(_age), height(_height) {
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};

1> 创建block的时候,直接 auto修饰 的age封装到了block中了,block外再修改,不会影响block内部的age;
2> static修饰的height,传到block内部的是一个指针;外部修改,也会影响block内部的结果。

为何这样设置 ?
扩展 :self 会被捕获吗 ?
- (void)test {
    void (^block)(void) = ^{
        NSLog(@"-------%p", self);
    };
    block();
}
// test函数完整写法如下:
- (void)test(Object *self, SEL _cmd) {
}


上一篇下一篇

猜你喜欢

热点阅读