说到循环引用问题,想必你们都碰到过吧,好比在使用Block的时候,使用__weakSelf来代替self解决等,可是对于这个,仍是有很多能够探索的点,下面我就来讲下,但愿对你们有所帮助。网络
是否全部的Block中,使用self都会致使循环引用?动画
答案是否认的!以下面所示的这种状况spa
如上,使用系统自带的UIView的Block,控制器能够被销毁,说明并无发生循环引用。3d
缘由:UIView调用的是类方法,当前的控制器不可能强引用一个类,因此循环没法造成,动画的block不会形成循环引用code
除了系统自带的某些Block不会引发循环引用外,咱们你们常使用的AFN中的block是否循环引用呢?答案以下图所示:blog
很明显,经过Log能够看到它不会致使循环引用开发
缘由:AFN无循环是由于绝大部分状况下,使用的网络类是不会被当前控制器引用的,这时就不会造成引用环(查资料得知)class
那什么状况下会致使循环引用呢?--> 自定义的Blocktest
咱们在viewDidKLoad中打印,在该控制器每次进入都会打印,在该控制器消失的时候,若是没有调用dealloc,说明该block引发了循环引用变量
如上图,咱们发现log中并无打印“-[SecondViewController viewDidLoad] --->dealloc”。说明block中使用self,致使了循环引用
致使循环引用的缘由:相互强指向
解决方法:使用weakSelf
__weak typeof(self) weakSelf = self; _testBlock = ^ { NSLog(@"%@",weakSelf.view); };
如上所说,那么自定义Block是否必定会发生循环引用?
如图:咱们发现oneVC被销毁了,说明自定义的Block,里面使用self,并不必定发生循环引用
原理:block-->强指向了self,可是self,并无指向Block。并无一个self.xxBlcok或者成员变量block,全部的block并无被强指向,因此没有发生循环引用
既然系统的Block、AFN都不会发生循环引用,自定义的Block循环引用会有⚠️提示,那么实际开发中真的不会遇到循环引用?
在实际开发中,使用通知,调用系统自带的Block方法,在block中使用self,会发生循环引用
咱们在ThirdVC中发送通知给SecondVC
在SecondVC中接收通知
当从SecondVC pop回OneVC时,SecondVC并无调用dealloc,说明存在循环引用,当时控制器没法销毁。这是由于在通知的方法的Block中使用了self,可是此次并无提示,不过确实是发生了循环引用!
解决方法:使用weakSelf!
总结:
以上就是所有内容了,但愿对看到的各位有所帮助,若是存在疑问或者发现任何问题你们能够浏览交流。