内存泄漏检测

在开发中,难免会有内存泄漏的问题,一般,通过静态分析就可以初步的了解到代码的一些不规范的地方或存在的内存泄漏,这是我们第一步做的内存检测。

但由于应用的开发是动态执行的,单单从程序上看是看不出有哪些毛病的,所以有些内存泄漏问题是应用操作时才会出现,对于这样泄漏问题的动态内存检测,Xcode自带了工具(instruments)。

使用方法:点击Product->Profile,然后选择leaks工具,进入界面点击运行,instruments就会开始自动检测内存泄漏的方法了,在此期间,可以对手机上运行的测试工程进行操作,图形界面中,上面是Allocations,下面是Leaks,当出现一条红色条柱时,就是出现了内存泄漏;点击界面中间分隔条,选择Call Tree选项,然后勾选右下角‘Invert Call Tree’和‘Hide System Libraries’选项,就可以看到具体是哪个类中的哪个方法出现了内存泄漏了,双击类名,就能显示此类此方法中造成的内存泄漏代码,接下来就是针对性的优化代码、内存优化了。

现在都是ARC模式,因此一般出现泄漏的地方都是block中的self没有使用weak类型;或者两个类之间出现循环引用。有些第三方框架也可能会引起内存泄漏。详见:http://blog.csdn.net/hello_hwc/article/details/46372715

代码测试内存泄漏之前我们需注意一下,在dealloc的方法中我们是否已经释放了该对象所拥有的所有对象。观察对象的生成和销毁是否配对。就是说init(创建对象的方法)和dealloc是否会被成对触发(创建一次销毁一次)。

遇到的一些隐秘的造成内存泄漏的情况:

1.两个对象互相拥有:a对象retain/addSubview了b对象,b对象也同时retain/addSubview了a对象。注意:delegate不要用retain属性,会导致互相拥有。

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]。

你可能感兴趣的:(内存泄漏检测)