美文网首页
Block 导致循环引用的问题

Block 导致循环引用的问题

作者: yue_kyy | 来源:发表于2019-07-11 15:56 被阅读0次

探究一

是否所有的 Block 中,使用 self 都会导致循环引用?

系统自带的Block不会发生循环引用

如图,使用系统自带的 UIView 的 Block ,控制器能被销毁-->说明没有发生循环引用。

原理:UIView 调用的是类方法,当前控制器不可能强引用一个类,所以循环引用无法形成-->动画 Block 不会造成循环引用的原因。

所以通过实践得出第一个结论-->并不是所有的 Block 中使用 self,都会导致循环引用!


探究二

除了系统自带的 Block,在其他 Block 中使用 self 会导致循环引用吗?

AFN框架

AFN的Block是否会导致循环引用测试

如上图所示,在 AFN 的 block 使用 self,并不会导致循环引用。

原因:因为 self 不持有 AFN 的 block,只是 AFN 的 block 持有 self,仅仅是单向持有,并没有相互强引用~所以不会造成循环引用。


探究三

那什么情况下会导致循环引用呢?-->自定义 Block

自定义Block中使用self

添加 viewDidLoad 提示框-->每次进入都打印 viewDidLoad ,可以确定是否离开试图控制器,如果是,但是没有调用 dealloc -->循环引用

循环引用

循环引用发生了,所以,在实际开发中,使用自定义 Block,在 Block{} 中使用 self ,导致了循环引用。

循环引用导致的原因:相互强指向

循环引用原因

如何解决:使用 weakSelf


如果是自己写的 Block,(非系统和 AFN ),在 Block 中使用 self ,是否一定会发生循环引用?

探究四

自定义 Block 是否一定会发生循环引用?

其他 vc 声明一个强指向的 Block 调用 Block 执行效果

如图:发现 oneVC 被销毁了,说明,自己定义的 Block ,使用了 self ,并不一定会发生循环引用!

原理:Block 强指向了 self,但是 self,并没有指向 Block,并没有一个 self.block 或者成员变量 block,所以 block 并没有被强指向,没有发生循环引用。

Tips:循环引用发生的条件就是持有这个 block  的对象,在 block 里边加入的对象持有。

原文:https://www.jianshu.com/p/fc2f4d207d25

相关文章

网友评论

      本文标题:Block 导致循环引用的问题

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