探究一
是否所有的 Block 中,使用 self 都会导致循环引用?
如图,使用系统自带的 UIView 的 Block ,控制器能被销毁-->说明没有发生循环引用。
原理:UIView 调用的是类方法,当前控制器不可能强引用一个类,所以循环引用无法形成-->动画 Block 不会造成循环引用的原因。
所以通过实践得出第一个结论-->并不是所有的 Block 中使用 self,都会导致循环引用!
探究二
除了系统自带的 Block,在其他 Block 中使用 self 会导致循环引用吗?
AFN框架
如上图所示,在 AFN 的 block 使用 self,并不会导致循环引用。
原因:因为 self 不持有 AFN 的 block,只是 AFN 的 block 持有 self,仅仅是单向持有,并没有相互强引用~所以不会造成循环引用。
探究三
那什么情况下会导致循环引用呢?-->自定义 Block
添加 viewDidLoad 提示框-->每次进入都打印 viewDidLoad ,可以确定是否离开试图控制器,如果是,但是没有调用 dealloc -->循环引用
循环引用发生了,所以,在实际开发中,使用自定义 Block,在 Block{} 中使用 self ,导致了循环引用。
循环引用导致的原因:相互强指向
如何解决:使用 weakSelf
如果是自己写的 Block,(非系统和 AFN ),在 Block 中使用 self ,是否一定会发生循环引用?
探究四
自定义 Block 是否一定会发生循环引用?
如图:发现 oneVC 被销毁了,说明,自己定义的 Block ,使用了 self ,并不一定会发生循环引用!
原理:Block 强指向了 self,但是 self,并没有指向 Block,并没有一个 self.block 或者成员变量 block,所以 block 并没有被强指向,没有发生循环引用。
Tips:循环引用发生的条件就是持有这个 block 的对象,在 block 里边加入的对象持有。