iOS 面试题:什么时候在 block 中不需要使用 weakSelf --转自唐巧

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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? 如果有,请举一个例子并且解释这种情况下如何解决循环引用问题。

以上是关于iOS 面试题:什么时候在 block 中不需要使用 weakSelf --转自唐巧的主要内容,如果未能解决你的问题,请参考以下文章

iOS 面试题:为什么 weakSelf 需要配合 strong self 使用 --转自唐巧

iOS经典面试题之深入分析block相关高频面试题

面试题:Block循环引用的理解

李洪强iOS经典面试题12

什么时候在block中不需要使用weakSelf

阿里字节:高效 iOS 面试题之 Block