为什么系统的block,AFN网络请求的block内使用self不会造成循环引用?

来源:互联网 发布:淘宝客如何推广店铺 编辑:程序博客网 时间:2024/05/21 13:55


其实只要抓住循环引用的本质。所谓循环引用,是因为当前控制器在引用着block,而block又引用着self即当前控制器,这样就造成了循环引用。



关于这个问题,UIView和AFN还是不一样的。

首先循环引用发生的条件就是持有这个block的对象,被block里边加入的对象持有。当然是强引用。

所以UIView的动画block不会造成循环引用的原因就是,这是个类方法,当前控制器不可能强引用一个类,所以循环无法形成。

UIView中的block持有当前控制器,但是当前控制器中是没有持有UIView类的,没有形成循环.当动画结束时,UIView会结束持有这个block,如果没有别的对象持有block的话,block对象就会被释放掉,从而block会释放掉对self的持有,整个内存引用关系被解除.



AFNetworking是因为人家大神自己封装了一个completionBlock,不管你传进来是啥,都给你把循环引用打破。
这是较低版本的,AF3.0以上的好像没这个了 . 
AFURLConnectionOperation 里的一个请求结束之后,setCompleteBlock会把block设置为nil,来打破循环引用 .
看图:




通用情况 :   在block本身不被self持有,而被别的对象持有,同时不产生循环引用的时候,就不需要使用weakself了.

0 0