探究Block對weak對象的捕獲原理

關(guān)于OC中Block的實現(xiàn)原理,百度可以搜到一堆。但沒有一篇文章說明__weak修飾的變量是如何被捕獲的為何沒影響到原對象的引用計數(shù)。以下是對這個丟失的部分的補充。

PS:閱讀以下內(nèi)容之前,應(yīng)了解Block和weak的實現(xiàn)原理。

1. 首先,main.m有以下代碼
typedef void(^Block)();

Block block;

int main(int argc, char * argv[]) {
    
    NSObject *obj = [NSObject new];
    
    NSLog(@"%@",[obj valueForKey:@"retainCount"]);
    
    __weak id weakObj = obj;
    
    block = ^{
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_global_queue(0, 0), ^{
            NSLog(@"weakObj -- %@",[weakObj valueForKey:@"retainCount"]);
        });
    };
    
    block();
    
    NSLog(@"%@",[obj valueForKey:@"retainCount"]);
    
    sleep(10);
}
2. cd到工程目錄后,clang重寫

clang -rewrite-objc -fobjc-arc -stdlib=libc++ -mmacosx-version-min=10.7 -fobjc-runtime=macosx-10.7 -Wno-deprecated-declarations main.m

3. 打開main.cpp并觀察重寫后的block結(jié)構(gòu)體
struct __main_block_impl_0 {
  struct __block_impl impl;
  struct __main_block_desc_0* Desc;
  __weak id weakObj;
  __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, __weak id _weakObj, int flags=0) : weakObj(_weakObj) {
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};
4. 結(jié)論

如果你也注意到了__weak id weakObj;想必已經(jīng)明了。

完。

最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 《Objective-C高級編程》這本書就講了三個東西:自動引用計數(shù)、block、GCD,偏向于從原理上對這些內(nèi)容...
    WeiHing閱讀 10,098評論 10 69
  • 一、Objective-C發(fā)展史 Objective-C從1983年誕生,已經(jīng)走過了30多年的歷程。隨著時間的推移...
    沒事蹦蹦閱讀 5,999評論 12 34
  • 一、定義一個Block 在上面的代碼中定義了一個無返回值無參數(shù)的block,并定義了一個全局變量globalStr...
    初心丶可曾記閱讀 386評論 1 3
  • 參考文檔1:BlocksRuntime/runtime.c參考文檔2:BlocksRuntime/Block_pr...
    破弓閱讀 940評論 0 4
  • 我以為忘記你 就可以過得很好 我以為不去打擾 你就會很好 我以為 靜靜的喜歡就好 我想看到你 開開心心就好
    小斑先森閱讀 194評論 0 0

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