您的位置:首页 > 移动开发 > IOS开发

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就能够正常销毁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: