iOS闭包循环引用情况

学习博客前需知道的概念有:闭包、Retain Cycle。

我的博客主要来源于:

https://mp.weixin.qq.com/s?__biz=MjM5OTM0MzIwMQ==&mid=404081690&idx=1&sn=43a783cb23bad5154e2e3f94303eea13&scene=0&uin=MTYzMDU2Njg2MQ%3D%3D&key=710a5d99946419d900eb41ea8134a224be2889a763e68a3756ee008ed775cc6887ec4eb2992e62d211f2ea1e536f8ae4&devicetype=iMac+MacBookAir6%2C2+OSX+OSX+10.10.5+build(14F27)&version=11020201&lang=zh_CN&pass_ticket=%2BtKiYsoFx546eqMxaj7GAlW2dpgBE%2Bl4OYqhW3uC%2BbWPuKvjKy8d8rG%2FmztgPdAx

 

一、为什么在闭包中很容易造成循环引用呢?

1、首先block属性修饰符必须是copy,这样类实例后对象持有block。

2、在block块中,使用类的属性时,其实就是持有self对象。

因此如何解决闭包中的循环引用问题?

将self对象赋值给用weak修饰的对象,然后在block块中使用新对象。

二、说到这个,就难免延伸到内存泄漏查找问题。

1、用静态工具Analyze,标记内存泄漏的地方。(XCode->Product->Analyze)

2、使用动态工具instrument的Leaks模板,包括Allocations模板在内。(XCode->Product->Profile)

3、工具检查不出时,通过人为分析检查。

另外,有个小技巧,可以在运行过后,查出没有被释放的对象。具体如:

在dealloc方法中加入代码:NSLog(@"内存泄漏判断:%@", [[self class] description]);

这样设置后,如果打印,则表示没有泄漏,如果没打印,则需要检查是否可以不释放该对象。

 

posted on 2016-02-28 02:13  Beche  阅读(334)  评论(0编辑  收藏  举报

导航