iOS Block深度剖析

static int b = 10; //静态全局变量
- (void)run{
    int number = 10;  //局部变量
    self.obj = [[NSObject alloc]init];  //类的属性
    void(^test)(void) = ^{    //block 块
    
        NSLog(@"%d",number);
        NSLog(@"%d",b);
        NSLog(@"%@",self.obj);
    };
    test();
}

clang -rewrite-objc  文件名称
编译之后对比来看:
static int b = 10;  //静态全局变量
//函数内block   生成结构体__test__run_block_impl_0  这个命名很简洁明了
struct __test__run_block_impl_0 { 
  struct __block_impl impl;
  struct __test__run_block_desc_0* Desc;
  int number;  //和局部变量同名 访问外部变量的机制就是生成对应的变量
  test *self;//使用类属性,不会直接生成对应属性变量名称,是声明类的实例变量 ,为什么循环引用,这就是原因。
  __test__run_block_impl_0(void *fp, struct __test__run_block_desc_0 *desc, int _number, test *_self, int flags=0) : number(_number), self(_self) {
    impl.isa = &_NSConcreteStackBlock; //栈上block
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};
static void __test__run_block_func_0(struct __test__run_block_impl_0 *__cself) {
     //block调用,传递一个自动生成对应标志位(0)的结构体
     //获取变量
      int number = __cself->number; 
      test *self = __cself->self; 
      NSLog(@"%d",number);
      NSLog(@"%d",b);
       NSLog(@"%@",self.obj);
   }

总结:block 重要的两点:获取变量和函数指针。

你可能感兴趣的:(iOS Block深度剖析)