美文网首页
关于Block循环引用

关于Block循环引用

作者: Ricky_May | 来源:发表于2018-01-08 11:35 被阅读0次

    关于使用__weak和__strong

    大家都看到别人在block里面使用self或者self的属性的时候要使用__weak修饰self,然后才能block里面使用,在block里面使用的时候又将weakSelf使用__strong修饰进行使用,比如:

    __weak __typeof(self) weakSelf  = self;
    self.block = ^{
        __strong __typeof(weakSelf) self = weakSelf; 
        [self doSomeThing];
        [self doOtherThing];
    };
    

    为什么在block前面需要使用weakSelf

    因为在自创建的Block中,很有可能发生的情况是,我在block还没执行完毕时就销毁了当前对象(比方说用户关闭了当前页面),这时就会因为block还对self有强引用,而没有立即销毁,这会引起很多问题,比方说你写在 - (void)dealloc {} 中的代码并不能马上得到执行。所以为了避免这种情况,我们会在block前加上 __weak __typeof(self)weakSelf = self; 的定义来使block对self获取一个弱引用(也就是refrence count不会加1)。

    为什么在block里面需要使用__strong

    当你加了WeakSelf后,block中的self随时都会有被释放的可能,所以会出现一种情况,在调用doSomething的时候self还存在,在doOtherThing的时候self就变成nil了,所以为了避免这种情况发生,我们会重新__strong weakSelf。一般情况下,我们都建议这么做,这没什么风险,除非你不关心self在执行过程中变成nil。

    总结:
    为了保证block执行完毕之前self不会被释放,执行完毕的时候再释放。这时候会发现为什么在block外边使用了__weak修饰self,里面使用__strong修饰weakSelf的时候不会发生循环引用!

    相关文章

      网友评论

          本文标题:关于Block循环引用

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