iOS面試題(2.)關於在block中使用weakSelf的討論
阿新 • • 發佈:2019-01-06
問題
我們知道,在使用 block 的時候,為了避免產生迴圈引用,通常需要使用 weakSelf 與 strongSelf,寫下面這樣的程式碼:
__weak typeof(self) weakSelf = self;
[self doSomeBlockJob:^{
__strong typeof(weakSelf) strongSelf = weakSelf;
if (strongSelf) {
...
}
}];
那麼請問:什麼時候在 block 裡面用 self,不需要使用 weak self?
|
|
|
|
|
|
|
| 思考時間,想好了請往下翻答案。
|
|
|
|
|
|
|
|
|
答案
當 block 本身不被 self 持有,而被別的物件持有,同時不產生迴圈引用的時候,就不需要使用 weak self 了。最常見的程式碼就是 UIView 的動畫程式碼,我們在使用 UIView 的
animateWithDuration:animations
方法 做動畫的時候,並不需要使用 weak self,因為引用持有關係是:
- UIView 的某個負責動畫的物件持有了 block
- block 持有了 self
因為 self 並不持有 block,所以就沒有迴圈引用產生,因為就不需要使用 weak self 了。
[UIView animateWithDuration:0.2 animations:^{ self.alpha = 1; }];
當動畫結束時,UIView 會結束持有這個 block,如果沒有別的物件持有 block 的話,block 物件就會釋放掉,從而 block 會釋放掉對於 self 的持有。整個記憶體引用關係被解除。
思考題
如果覺得上面的問題太簡單,可以想想下面兩個題目:
- 為什麼 block 裡面還需要寫一個 strong self,如果不寫會怎麼樣?
- 有沒有這樣一個需求場景,block會產生迴圈引用,但是業務又需要你不能使用 weak self? 如果有,請舉一個例子並且解釋這種情況下如何解決迴圈引用問題。