最近做内存泄露检查的InstrumentsLeaks使用心得

最近做内存泄露检查的Instruments-Leaks使用心得

Leak检查的建议
 
话说手上一个工程差不多结束了,到了优化和测试的阶段,开始第一次用Instruments,我很担心的内存泄露问题果然是存在的,而且还不少(虽然内存占用都很少)
 
使用上几个建议:
1.一定要打开右边的窗口看程序调用栈
2.显示的程序调用关系不是真正泄露的地方,而是该泄露对象产生的地方,或者最后一次访问的地方,查一下相关的应用又在哪里变化就行
3.实在不行的话左边窗口还有个感叹号,有对象release和retain的历史记录,不过不一定对应的到代码
4.现在还有些UIKit的泄露对象,我也不知道为什么,以后再看
 
关于代码几点建议:
1.检查自己代码中所有的 alloc,copy,multicopy,retain,release,autorelease,有占用就要有释放,必须一一对应的。
2.我曾经犯过的一个错误:两个对象相互应用的时候都用了retain,导致不能释放,比如A有个属性是B类型,@property(nonatomic,retain) B *childB;,然后B里面又有个a  @property(nonatomic,retian) A *parentA。这就会造成不能释放,正确做法是考虑一下两者的层级关系,子对象就别retain父对象了。改为 @property(nontomic,assign) A *parentA; ,另外我一般要用父对象都用delegate,这是正规做法吧
3.一个对象如果设置了retain 的property属性,就必须调用 self.prop = xxx 来设置,不然老对象不会自动释放。比如:
in XX.h
B *_childB;
@property(nonatomic,retain) B *childB;
 
in XX.m
@synthesized childB = _childB;
 
然后在方法里面,有时候用 self.childB = xxxx; 有时候用 _childB = xxxx; 这样,上一个retain的对象就泄露了,正确做法就是用self.childB = xxxx  或者  [_childB release], _childB = [xxxx retain];
最后在dealloc释放:self.childB = xxxx;
 
看过书的应该知道retain property 的set方法有几步,相当于:
-setChildB:(B*)b
{
  [b retain];
  [_childB release];
  _childB = [b retain];
  [b release];
}
第一个retain是防万一b==_childB
 
后续看有没有需要截图或细化,有说的不对的地方请大家指正,谢谢。

原文地址:https://www.cnblogs.com/lsck/p/2511527.html