關(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)引用!