OC中Block使用了__weak和__strong依然不會(huì)循環(huán)引用原因

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

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

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

為什么使用weakSelf

????通過 clang -rewrite-objc 源代碼文件名 將代碼轉(zhuǎn)為c++代碼(實(shí)質(zhì)是c代碼),可以看到block是一個(gè)結(jié)構(gòu)體,它會(huì)將全局變量保存為一個(gè)屬性(是__strong的),而self強(qiáng)引用了block這會(huì)造成循環(huán) 引用。所以需要使用__weak修飾的weakSelf。

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

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

????PS:strongSelf只是為了保證在block內(nèi)部執(zhí)行的時(shí)候不會(huì)釋放,但存在執(zhí)行前self就已經(jīng)被釋放的情況,導(dǎo)致strongSelf=nil。注意判空處理。

不會(huì)引起循環(huán)引用的原因

????因?yàn)閎lock截獲self之后self屬于block結(jié)構(gòu)體中的一個(gè)由__strong修飾的屬性會(huì)強(qiáng)引用self, 所以需要使用__weak修飾的weakSelf防止循環(huán)引用。
????block使用的__strong修飾的weakSelf是為了在block(可以理解為函數(shù))生命周期中self不會(huì)提前釋放。strongSelf實(shí)質(zhì)是一個(gè)局部變量(在block這個(gè)“函數(shù)”里面的局部變量),當(dāng)block執(zhí)行完畢就會(huì)釋放自動(dòng)變量strongSelf,不會(huì)對(duì)self進(jìn)行一直進(jìn)行強(qiáng)引用。

總結(jié)

????外部使用了weakSelf,里面使用strongSelf卻不會(huì)造成循環(huán),究其原因就是因?yàn)閣eakSelf是block截獲的屬性,而strongSelf是一個(gè)局部變量會(huì)在“函數(shù)”執(zhí)行完釋放。

????有什么問題歡迎大家留言探討。

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

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

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