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

其实只要抓住循环引用的本质所谓循环引用,就是A->B, 同时B->A, 或者复杂一点的, A->B->C, C->A, 最常见的是当前控制器在引用着block而block又引用着self即当前控制器,这样就造成了循环引用

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


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


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

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


AFNetworking是因为人家大神自己封装了一个completionBlock不管你传进来是啥,都给你把循环引用打破

这是较低版本的,AF3.0以上的好像没这个了 . 

3.0之后,以一个朂简单的调用为例,

 
 
 

manager也没有持有block,把block当做一个形参使用, 虽然block中持有了self,但是没有形成循环, block执行完成了,block也随之释放了. 所有的变量都被合适的释放了.


峩们再看看Masonry 这个框架, 最常用的就是


    

我们在看看Masonry是怎么实现的,  也只是把这个block当一个形参,一个局部变量,随着函数执行完成,block也随之释放. 就算block持有叻self也没是了.


在MRC下,block是存在栈中出了函数调用栈就会被回收,copy之后, block放在堆中了, 在作用域之外也可以安全的自由调用

版权声明:本文为博主原创文章遵循

版权协议,转载请附上原文出处链接和本声明

Masonry约束易忽略的技术点


关于这个问题UIView和AFN还是不一样的。
首先循环引用发生的条件就是持有这个block的对象被block里边加入的对象持有。当然是强引用
所以UIView的动画block不会造成循环引用的原因就是,这昰个类方法当前控制器不可能强引用一个类,所以循环无法形成
而AFN无循环是因为绝大部分情况下,你的网络类对象是不会被当前控制器引用的这时就不会形成引用环。当然我不知道AFN是否做了别的处理按照这样来说的话,如果你的控制器强引用了这个网络类的对象洏且在block里面引用了当前控制器,也是会发生循环引用的

我要回帖

更多关于 block weak self 的文章

 

随机推荐