關(guān)于Block循環(huán)引用

關(guān)于使用__weak和__strong

大家都看到別人在block里面使用self或者self的屬性的時候要使用__weak修飾self,然后才能block里面使用,在block里面使用的時候又將weakSelf使用__strong修飾進行使用,比如:

__weak __typeof(self) weakSelf  = self;
self.block = ^{
    __strong __typeof(weakSelf) self = weakSelf; 
    [self doSomeThing];
    [self doOtherThing];
};

為什么在block前面需要使用weakSelf

因為在自創(chuàng)建的Block中,很有可能發(fā)生的情況是,我在block還沒執(zhí)行完畢時就銷毀了當(dāng)前對象(比方說用戶關(guān)閉了當(dāng)前頁面),這時就會因為block還對self有強引用,而沒有立即銷毀,這會引起很多問題,比方說你寫在 - (void)dealloc {} 中的代碼并不能馬上得到執(zhí)行。所以為了避免這種情況,我們會在block前加上 __weak __typeof(self)weakSelf = self; 的定義來使block對self獲取一個弱引用(也就是refrence count不會加1)。

為什么在block里面需要使用__strong

當(dāng)你加了WeakSelf后,block中的self隨時都會有被釋放的可能,所以會出現(xiàn)一種情況,在調(diào)用doSomething的時候self還存在,在doOtherThing的時候self就變成nil了,所以為了避免這種情況發(fā)生,我們會重新__strong weakSelf。一般情況下,我們都建議這么做,這沒什么風(fēng)險,除非你不關(guān)心self在執(zhí)行過程中變成nil。

總結(jié):
為了保證block執(zhí)行完畢之前self不會被釋放,執(zhí)行完畢的時候再釋放。這時候會發(fā)現(xiàn)為什么在block外邊使用了__weak修飾self,里面使用__strong修飾weakSelf的時候不會發(fā)生循環(huán)引用!

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