美文网首页
iOS 面试题(二)什么时候在 block 中不需要使用 wea

iOS 面试题(二)什么时候在 block 中不需要使用 wea

作者: 凯旋之歌 | 来源:发表于2017-08-17 16:43 被阅读0次
    问题:我们知道,在使用 block 的时候,为了避免产生循环引用,通常需要使用 weakSelf 与 strongSelf,写下面这样的代码:

    __weak typeof(self) weakSelf = self;
    [self doSomeBlockJob:^{
       __strong typeof(weakSelf) strongSelf = weakSelf;
       if (strongSelf) {
           ...
       }
    }];
    那么请问:什么时候在 block里面用self,不需要使用weakself?

    当block本身不被self 持有,而被别的对象持有,同时不产生循环引用的时候,就不需要使用weakself了。最常见的代码就是UIView的动画代码,我们在使用UIView animateWithDuration:animations方法 做动画的时候,并不需要使用weakself,因为引用持有关系是:

    UIView 的某个负责动画的对象持有block,block 持有了self因为 self 并不持有 block,所以就没有循环引用产生,因为就不需要使用 weak self 了。

    [UIView animateWithDuration:0.2 animations:^{
       self.alpha = 1;
    }];
    当动画结束时,UIView会结束持有这个 block,如果没有别的对象持有block的话,block 对象就会释放掉,从而 block会释放掉对于 self 的持有。整个内存引用关系被解除。

    相关文章

      网友评论

          本文标题:iOS 面试题(二)什么时候在 block 中不需要使用 wea

          本文链接:https://www.haomeiwen.com/subject/dnlnrxtx.html