iOS 面試題(二):什么時候在 block 中不需要使用 weakSelf --轉自唐巧


問題

我們知道,在使用 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? 如果有,請舉一個例子並且解釋這種情況下如何解決循環引用問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM