03oc中block的循環(huán)引用 (一)

  1. @property (nonatomic, copy) void (^getCardInfo)(NSDictionary *cardInfo);
    @end
兩個(gè)點(diǎn): copy和 block

我將block聲明為copy的原因是在代碼塊里面我可能會使用一些本地變量, 而block一開始是放在棧上的,只有copy后才會放到堆上。
如果加copy屬性,當(dāng)其所在棧被釋放的時(shí)候,這些本地變量將變得不可訪問。一旦代碼執(zhí)行到block這段就會導(dǎo)致bad access。

brush.getCardInfo = ^(NSDictionary *info){
         [self test];
}

但是這又帶來另一個(gè)問題,就是self的引用計(jì)數(shù)+1。這意味著很可能會導(dǎo)致循環(huán)引用。self持有brush,brush持有block,block持有self。結(jié)果就是內(nèi)存泄漏。

解決辦法如下. 通過一種方式, 告訴 block 這個(gè)變量的引用計(jì)數(shù)不要+1
如果是 MRC的情況:

__block CurrentViewController *blockself = self;
brush.getCardInfo = ^(NSDictionary *info){
     [blockSelf test];
}

如果是 ARC的情況:

__weak CurrentViewController *blockself = self;
brush.getCardInfo = ^(NSDictionary *info){
     [blockSelf test];
}

1.解決辦法
簡而言之就是一句話的事情

__weak typeof (self) weakself = self;

經(jīng)過上面的測試發(fā)現(xiàn), 在加了__ weak 和__unsafe_unretained的變量引入后
TestCycleRetain方法可以正常秩序 dealloc 方法 , 而不轉(zhuǎn)換和用__block轉(zhuǎn)換的變量都會引起循環(huán)引用
因?yàn)榉乐寡h(huán)引用的方法如下:

__unsafe_unretained TestCycleRetain *weakSelf = self;

網(wǎng)上大部分人的表述是"block 里面引用了 self 導(dǎo)致循環(huán)引用", 但是事實(shí)真的這樣的嗎? 我表示懷疑, 其實(shí)這種說話是不嚴(yán)謹(jǐn)?shù)? 不一定是顯式地出現(xiàn)"self"字眼才會引起循環(huán)引用, 我們改一下代碼, 不通過屬性 self.arr 去訪問 arr 變量, 而是通過實(shí)例變量_ arr 去訪問, 如下
即使在你的代碼沒有顯式地出現(xiàn)"self", 也會出現(xiàn)循環(huán)引用, 只要你在 block 里用到了 self 所擁有的東西, 但對于這種情況, 目前我不知道如何排除掉循環(huán)引用 , 因?yàn)槲覀儫o法通過加__weak 聲明或者_(dá)_block聲明去禁止 block 對 self 進(jìn)行強(qiáng)引用或者強(qiáng)制增加引用計(jì)數(shù), 對于 self.arr 的情況, 我們要分兩種環(huán)境去解決,

  1. MRC

    __block typeof(self) weakSelf = self,
    
  2. ARC

    __weak typeof(self) weakSelf = self, 其實(shí)__weak someClass *weakSelf = self也是 OK 的
    

解決方式與上述基本一致, 只不過將__ block 關(guān)鍵字換成了__ weak, 這樣的意思就是告訴 block, 咱們已經(jīng)沒有任何的關(guān)系, 不要在內(nèi)部對 self 進(jìn)行 retain 了

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

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

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