block循环引用以及为什么用copy修饰
2017-05-26 11:06
357 查看
循环引用:实质是当前控制器在引用着block,而block又引用着self即当前控制器,这样就造成了循环引用
UIView和AFN还是不一样的。
首先循环引用发生的条件就是持有这个block的对象,被block里边加入的对象持有。当然是强引用。
所以UIView的动画block不会造成循环引用的原因就是,这是个类方法,当前控制器不可能强引用一个类,所以循环无法形成。
UIView中的block持有当前控制器,但是当前控制器中是没有持有UIView类的,没有形成循环.当动画结束时,UIView会结束持有这个block,如果没有别的对象持有block的话,block对象就会被释放掉,从而block会释放掉对self的持有,整个内存引用关系被解除.
而AFN无循环是因为绝大部分情况下,你的网络类对象是不会被当前控制器引用的,这时就不会形成引用环。当然我不知道AFN是否做了别的处理,按照这样来说的话,如果你的控制器强引用了这个网络类的对象,而且在block里面引用了当前控制器,也是会发生循环引用的。
block: 一般用copy来修饰,在arc环境下编译器默认会用copy修饰,一般情况下在block需要捕获外界数据时,该block就会被分配在堆区;
但在MRC环境下犹豫手动管理引用计数,block一般被分配在栈区,需要copy到堆区来防止野指针错误
参考了下面链接中的内容:
http://blog.csdn.net/u014600626/article/details/70237985 https://www.zhihu.com/question/36358590
UIView和AFN还是不一样的。
首先循环引用发生的条件就是持有这个block的对象,被block里边加入的对象持有。当然是强引用。
所以UIView的动画block不会造成循环引用的原因就是,这是个类方法,当前控制器不可能强引用一个类,所以循环无法形成。
UIView中的block持有当前控制器,但是当前控制器中是没有持有UIView类的,没有形成循环.当动画结束时,UIView会结束持有这个block,如果没有别的对象持有block的话,block对象就会被释放掉,从而block会释放掉对self的持有,整个内存引用关系被解除.
而AFN无循环是因为绝大部分情况下,你的网络类对象是不会被当前控制器引用的,这时就不会形成引用环。当然我不知道AFN是否做了别的处理,按照这样来说的话,如果你的控制器强引用了这个网络类的对象,而且在block里面引用了当前控制器,也是会发生循环引用的。
block: 一般用copy来修饰,在arc环境下编译器默认会用copy修饰,一般情况下在block需要捕获外界数据时,该block就会被分配在堆区;
但在MRC环境下犹豫手动管理引用计数,block一般被分配在栈区,需要copy到堆区来防止野指针错误
参考了下面链接中的内容:
http://blog.csdn.net/u014600626/article/details/70237985 https://www.zhihu.com/question/36358590
相关文章推荐
- block为什么用copy以及如何解决循环引用
- block的循环引用问题2(block为什么用copy修饰)及处理循环引用
- block为什么用copy以及如何解决循环引用
- 探讨OC的内存管理 以及防止循环引用retain cycle 代理为什么用weak block为什么用copy
- iOS内存管理(4)--Block属性用copy修饰 & 避免循环引用的问题
- iOS开发小技巧--键盘处理以及解决block造成循环引用的小技巧
- NSOperation 之 Block循环引用——以及nil Nil NULL [NULL null]的区别
- iOS 面试题(九):为什么block要使用copy而不是strong或者其他属性修饰?
- ios 基础Block为什么用copy修饰
- block的copy和循环引用的问题
- block使用时的一些情况以及防止循环引用
- block为什么使用copy修饰
- IOS开发--循环引用问题,普通控件为什么用weak,代理为什么用weak,block内用到外面的东
- 关于Block的copy和循环引用的问题
- Block 为什么要用 Copy 修饰
- 关于Block的copy和循环引用的问题
- iOS开发Block的介绍以及Block的循环引用问题
- Block为什么用copy修饰
- iOS之Block为什么用copy修饰
- iOS - Block产生Memory Leaks循环引用导致的内存泄漏以及解决方案