關(guān)于使用__weak和__strong
????大家都看到別人在block里面使用self或者self的屬性的時候要使用__weak修飾self搭伤,然后才能block里面使用亡呵,在block里面使用的時候又將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++代碼(實質(zhì)是c代碼)哥攘,可以看到block是一個結(jié)構(gòu)體宋距,它會將全局變量保存為一個屬性(是__strong的)诚些,而self強引用了block這會造成循環(huán) 引用男韧。所以需要使用__weak修飾的weakSelf。
為什么在block里面需要使用strongSelf
???? 是為了保證block執(zhí)行完畢之前self不會被釋放葛圃,執(zhí)行完畢的時候再釋放千扔。這時候會發(fā)現(xiàn)為什么在block外邊使用了__weak修飾self,里面使用__strong修飾weakSelf的時候不會發(fā)生循環(huán)引用库正?曲楚!
????PS:strongSelf只是為了保證在block內(nèi)部執(zhí)行的時候不會釋放,但存在執(zhí)行前self就已經(jīng)被釋放的情況诀诊,導(dǎo)致strongSelf=nil洞渤。注意判空處理。
不會引起循環(huán)引用的原因
????因為block截獲self之后self屬于block結(jié)構(gòu)體中的一個由__strong修飾的屬性會強引用self属瓣, 所以需要使用__weak修飾的weakSelf防止循環(huán)引用。
????block使用的__strong修飾的weakSelf是為了在block(可以理解為函數(shù))生命周期中self不會提前釋放讯柔。strongSelf實質(zhì)是一個局部變量(在block這個“函數(shù)”里面的局部變量)抡蛙,當(dāng)block執(zhí)行完畢就會釋放自動變量strongSelf,不會對self進(jìn)行一直進(jìn)行強引用魂迄。
總結(jié)
????外部使用了weakSelf粗截,里面使用strongSelf卻不會造成循環(huán),究其原因就是因為weakSelf是block截獲的屬性捣炬,而strongSelf是一個局部變量會在“函數(shù)”執(zhí)行完釋放熊昌。
????有什么問題歡迎大家留言探討绽榛。