美文网首页
关于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