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ù)指針。
iOS Block深度剖析
最后編輯于 :
?著作權(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ù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。