内存泄漏检测
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存泄漏检测相关的知识,希望对你有一定的参考价值。
1.静态分析
通过静态分析我们可以最初步的了解到代码的一些不规范的地方或者是存在的内存泄漏,这是我们第一步对内存泄漏的检测。当然有一些警告并不是我们关心的可以略过。
2.通过instruments来检查内存泄漏
这个方法能粗略的定位我们在哪里发生了内存泄漏。方法是完成一个循环操作,如果内存增长为0就证明我们程序在该次循环操作中不存在内存泄漏,如果内存增长不为0那证明有可能存在内存泄漏,当然具体问题需要具体分析。
关于ios的动态内存检测,Xcode自带了工具(instruments):Leaks。神马,你不知道这个单词是什么意思?google一下,翻译过来意思是“泄露”。
使用方法:点击Product->Profile,然后选择那个漏水的水管Leaks,进入界面后,点击运行,instruments就会开始自动检测内存泄露的地方了,在这个过程中,可以对手机上运行的测试工程进行操作,图形界面中,上面是Allocations,下面是Leaks,当出现了一条红色的小柱子的时候,就是出现了内存泄露;点击界面中间分隔条,选择Call Tree选项,然后把右边的 “Invert Call Tree” 和 “Hide System Libraries”选项,就可以看到具体是那个类中得哪个方法出现了内存泄露了,双击类名,就出显示出此类此方法中造成的内存泄露代码,ok,接下来就是有针对性的进行代码优化,内存优化了。
由于现在用得都是ARC模式,所以一般出现泄露的地方都是block中的self疏忽了,没有使用weak类型;或者,两个类之间出现了循环应用这种低级错误引起的。不过,有些第三方框架也可能会引起内存泄露,比如,公司项目中使用的 微客服 这个第三方的客服系统就出现了内存泄露问题。
详见:http://blog.csdn.net/lifengzhong/article/details/7739507
3.代码测试内存泄漏
在做这项工作之前我们要注意一下,在dealloc的方法中我们是否已经释放了该对象所拥有的所有对象。观察对象的生成和销毁是否配对。准确的说就是 init(创建对象的方法)和dealloc是否会被成对触发(简单说来就是走一次创建对象就有走一次dealloc该对象)。
下面是自己遇到的一些比较隐秘的造成内存泄漏的情况:
1.两个对象互相拥有:也就是说对象a里面retain/addSubview了b对象,b对象同时也retain/addSubView了a对象。注意:delegate不要用retain属性,要用assign属性也会导致互相拥有。
2.有时候需要用removeFromSuperView来释放:具体说明,也许我的a对象拥有一个b对象,b对象add到了c对象上,而在我们的设计中b对象的生命周期应该和a对象相同;这时候只一句[b release]/self.b = nil是不能把b对象释放掉的(一般情况下release会使其retainCount-1,[super dealloc]会再次将所有subView的retainCount-1,而b并不是a的subView,所有最后的一次-1没有了);所以我们需要在之前加上[b removeFromSuperView]。
新年快乐
以上是关于内存泄漏检测的主要内容,如果未能解决你的问题,请参考以下文章