問題
我們知道,在使用 block 的時候,為了避免產(chǎn)生循環(huán)引用,通常需要使用 weakSelf 與 strongSelf,寫下面這樣的代碼:
__weaktypeof(self) weakSelf = self;
[self doSomeBlockJob:^{
? ? __strong typeof(weakSelf) strongSelf = weakSelf;
? ? if (strongSelf) {
? ? ? ? ...
? ? }
}];
那么請問:什么時候在 block 里面用 self,不需要使用 weak self?
答案
當(dāng) block 本身不被 self 持有,而被別的對象持有,同時不產(chǎn)生循環(huán)引用的時候,就不需要使用 weak self 了。最常見的代碼就是 UIView 的動畫代碼,我們在使用 UIView 的?animateWithDuration:animations?方法 做動畫的時候,并不需要使用 weak self,因為引用持有關(guān)系是:
UIView 的某個負(fù)責(zé)動畫的對象持有了 block
block 持有了 self
因為 self 并不持有 block,所以就沒有循環(huán)引用產(chǎn)生,因為就不需要使用 weak self 了。
[UIView animateWithDuration:0.2animations:^{
? ? self.alpha =1;
}];
當(dāng)動畫結(jié)束時,UIView 會結(jié)束持有這個 block,如果沒有別的對象持有 block 的話,block 對象就會釋放掉,從而 block 會釋放掉對于 self 的持有。整個內(nèi)存引用關(guān)系被解除。
思考題
如果覺得上面的問題太簡單,可以想想下面兩個題目:
為什么 block 里面還需要寫一個 strong self,如果不寫會怎么樣?
有沒有這樣一個需求場景,block會產(chǎn)生循環(huán)引用,但是業(yè)務(wù)又需要你不能使用 weak self? 如果有,請舉一個例子并且解釋這種情況下如何解決循環(huán)引用問題。