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

在软件开发过程中,结束工程的优化与测试阶段时,利用Instruments进行内存泄露检查至关重要。文章提供了有效的检查建议,包括关注程序调用栈、识别泄露源、检查对象的retain与release历史,并对代码中retain和release的正确使用提出指导。此外,文章还讨论了如何避免对象相互retain导致的内存泄露问题,以及如何正确处理retain属性的设置与释放。


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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值