iOS Block深度剖析

static int b = 10; //靜態(tài)全局變量
- (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;  //靜態(tài)全局變量
//函數(shù)內(nèi)block   生成結(jié)構(gòu)體__test__run_block_impl_0  這個命名很簡潔明了
struct __test__run_block_impl_0 { 
  struct __block_impl impl;
  struct __test__run_block_desc_0* Desc;
  int number;  //和局部變量同名 訪問外部變量的機制就是生成對應(yīng)的變量
  test *self;//使用類屬性,不會直接生成對應(yīng)屬性變量名稱,是聲明類的實例變量 ,為什么循環(huán)引用,這就是原因。
  __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調(diào)用,傳遞一個自動生成對應(yīng)標(biāo)志位(0)的結(jié)構(gòu)體
     //獲取變量
      int number = __cself->number; 
      test *self = __cself->self; 
      NSLog(@"%d",number);
      NSLog(@"%d",b);
       NSLog(@"%@",self.obj);
   }

總結(jié):block 重要的兩點:獲取變量和函數(shù)指針。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容