ios开发之使用block引发循环引用导致内存泄露
2015-03-28 23:10
316 查看
首先来看一个动态图:
由图可知,我们从One跳转到了Two(TwoViewController)
接下来看一段代码:
从代码中我们可以看到:
1,JLPerson有一个结构体MyBlock类型的属性
2,JLTwoViewController中有一个数组persons,该数组用于存储JLPerson对象
3,persons数组中有一个name属性为"lisi"的JLPerson对象
4,在JLTwoViewController中重写了父类的dealloc方法,该方法用于查看JLTwoViewController是否被销毁。
当我们执行上述代码时,会来到动态图所示的One,然后点击“跳转到Two”,然后点击“返回One”。
正常情况下,当点击“返回One”回到One之后,这时应该会调用JLTwoViewController的dealloc方法,打印出log,其实不然。
JLTwoViewController中有一个强引用(strong)的persons指向了NSArray,NSArray中有一个强引用的“lisi”指向了JLPerson,JLPerson中有一个强引用(copy也是强引用)的block,该block中self指向了JLTwoViewController。于是形成了循环引用,这些对象都不会被释放,导致了内存泄露。也就是说,当我们点击“返回One”,JLTwoViewController并不会被销毁。
解决办法:
从代码中可以看到,我们强制的使用了弱引用,也就是让上图所示的第④条线变成了弱引用,这样就打破这个循环引用,JLTwoViewController就能够正常销毁。
由图可知,我们从One跳转到了Two(TwoViewController)
接下来看一段代码:
从代码中我们可以看到:
1,JLPerson有一个结构体MyBlock类型的属性
2,JLTwoViewController中有一个数组persons,该数组用于存储JLPerson对象
3,persons数组中有一个name属性为"lisi"的JLPerson对象
4,在JLTwoViewController中重写了父类的dealloc方法,该方法用于查看JLTwoViewController是否被销毁。
当我们执行上述代码时,会来到动态图所示的One,然后点击“跳转到Two”,然后点击“返回One”。
正常情况下,当点击“返回One”回到One之后,这时应该会调用JLTwoViewController的dealloc方法,打印出log,其实不然。
JLTwoViewController中有一个强引用(strong)的persons指向了NSArray,NSArray中有一个强引用的“lisi”指向了JLPerson,JLPerson中有一个强引用(copy也是强引用)的block,该block中self指向了JLTwoViewController。于是形成了循环引用,这些对象都不会被释放,导致了内存泄露。也就是说,当我们点击“返回One”,JLTwoViewController并不会被销毁。
解决办法:
从代码中可以看到,我们强制的使用了弱引用,也就是让上图所示的第④条线变成了弱引用,这样就打破这个循环引用,JLTwoViewController就能够正常销毁。
相关文章推荐
- iOS开发内存优化之自动检测内存泄露,检查是否有循环引用,检查内存为何如此大,Block循环引用的检查
- iOS开发内存优化之自动检测内存泄露,检查是否有循环引用,检查内存为何如此大,Block循环引用的检查
- iOS开发-Block使用及循环引用的解决
- iOS开发——Block循环引用问题的解决
- iOS之block使用小结、在arc中使用block、如何防止循环引用
- iOS: ARC和非ARC下使用Block与循环引用问题
- iOS开发 使用Xcode自带的Leaks:动态的检测内存泄露
- iOS开发之Block的循环引用
- ios 使用block中使用self可能产生的循环引用
- iOS开发——Block引起循环引用的解决方案
- 精通iOS开发--第15章 Grand Central Dispatch和后台处理之Block与Self的循环引用
- iPhone开发 - 使用self. 导致的内存泄露
- 循环引用导致内存泄露 dealloc无法调用
- iOS开发 使用Xcode自带的Leaks:动态的检测内存泄露
- iOS开发Block的介绍以及Block的循环引用问题
- iOS容易造成循环引用的三种场景之Block以及对应的使用方法(二)
- ios block 导致的循环引用
- IOS开发--循环引用问题,普通控件为什么用weak,代理为什么用weak,block内用到外面的东
- 浏览器内部循环引用导致的内存泄露
- iOS开发74-XCode(7.3.1)使用Instruments(7.3.1)测试内存泄漏例子(循环引用)