關(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(weakSelf) self = weakSelf;
[self doSomeThing];
[self doOtherThing];
};
為什么在block前面需要使用weakSelf
因?yàn)樵谧詣?chuàng)建的Block中坦刀,很有可能發(fā)生的情況是棺妓,我在block還沒執(zhí)行完畢時(shí)就銷毀了當(dāng)前對(duì)象(比方說用戶關(guān)閉了當(dāng)前頁(yè)面)裸诽,這時(shí)就會(huì)因?yàn)閎lock還對(duì)self有強(qiáng)引用掀抹,而沒有立即銷毀,這會(huì)引起很多問題伊诵,比方說你寫在 - (void)dealloc {} 中的代碼并不能馬上得到執(zhí)行单绑。所以為了避免這種情況,我們會(huì)在block前加上 __weak __typeof(self)weakSelf = self; 的定義來使block對(duì)self獲取一個(gè)弱引用(也就是refrence count不會(huì)加1)曹宴。
為什么在block里面需要使用__strong
當(dāng)你加了WeakSelf后搂橙,block中的self隨時(shí)都會(huì)有被釋放的可能,所以會(huì)出現(xiàn)一種情況笛坦,在調(diào)用doSomething的時(shí)候self還存在区转,在doOtherThing的時(shí)候self就變成nil了,所以為了避免這種情況發(fā)生弯屈,我們會(huì)重新__strong weakSelf蜗帜。一般情況下,我們都建議這么做资厉,這沒什么風(fēng)險(xiǎn)厅缺,除非你不關(guān)心self在執(zhí)行過程中變成nil。
總結(jié):
為了保證block執(zhí)行完畢之前self不會(huì)被釋放宴偿,執(zhí)行完畢的時(shí)候再釋放湘捎。這時(shí)候會(huì)發(fā)現(xiàn)為什么在block外邊使用了__weak修飾self,里面使用__strong修飾weakSelf的時(shí)候不會(huì)發(fā)生循環(huán)引用!