Instruments定位iOS应用的Memory Leaks


转:

http://www.jianshu.com/p/c0aa12d91f05


内存泄漏及影响
内存泄漏是动态分配的内存块,在程序的数据空间中任何位置都没有指向它的指针。这类块是孤立内存,由于没有指向这些块的指针,程序无法引用他们。

内存泄漏会导致App所占用的虚拟内存增加,且通常产生内存碎片,影响App及整个系统的性能。

通常情况下,导致内存泄漏的原因是未释放分配的内存,而又丢失指向分配块的指针。

Leaks工具
Xcode的Instruments里面有一个Leaks工具,可以帮助你定位发生内存泄漏的代码段,以便修复问题。

通过Xcode-Open Developer Tool-Instruments打开Instruments面板,选择Leaks工具,打开后界面如下图:


Leaks面板
选择Target,在右下角Display Setting面板的Call Tree,勾选Invert Call Tree和Hide System Libraries,方便接下来我们迅速查找有内存问题的代码段。


Display Setting
点击Recorder Button开始监测,出现下图红色X号,表示此处有内存泄漏问题。


内存泄漏
在时间轴上拖拽选择X号前后区域,可以在左下面板看到所选时间段内调用的函数栈。


函数栈
双击函数就可以打开具体的代码段,比如最下面一个内存泄漏定位的代码段如下:

- (NSDictionary*)updateTimestampFrom:(NSMutableDictionary*)dict
{
    int duration = [dict[OL][DURATION] intValue];
    NSUInteger expiredAt = [[NSDate date] timeIntervalSince1970] + duration;

    NSMutableDictionary *olDic = [[NSMutableDictionary alloc] initWithDictionary:dict[@"ol"]];
    [olDic setObject:@(expiredAt) forKey:EXPIRED];
    [dict setObject:olDic forKey:OL];
    return [NSDictionary dictionaryWithDictionary:dict];
}
这个类非ARC的,很明显olDic在alloc的时候Retain Count为1,setObject的时候Retain Count2变为2,导致内存泄漏。所以在setObject后面对olDic进行一次手动Release即可,如下:

- (NSDictionary*)updateTimestampFrom:(NSMutableDictionary*)dict
{
    int duration = [dict[OL][DURATION] intValue];
    NSUInteger expiredAt = [[NSDate date] timeIntervalSince1970] + duration;

    NSMutableDictionary *olDic = [[NSMutableDictionary alloc] initWithDictionary:dict[@"ol"]];
    [olDic setObject:@(expiredAt) forKey:EXPIRED];
    [dict setObject:olDic forKey:OL];
    [olDic release]
    return [NSDictionary dictionaryWithDictionary:dict];
}
后记
本文简单介绍了使用Leaks定位和解决iOS应用的内存泄漏问题。虽然现在已经进入到ARC时代,但是很多大型项目由于历史原因,使用ARC和MRC并存的内存管理方式,这种情况很容易产生内存泄漏。平时开发需要多留意编译flag是否添加,对于MRC的代码要注意及时释放内存,配合Leaks检测定位内存问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值