美文网首页IOS特技iOS实用iOS开发技术分享
使用Instruments定位iOS应用的Memory Leak

使用Instruments定位iOS应用的Memory Leak

作者: Pauley | 来源:发表于2016-01-03 14:25 被阅读15903次

内存泄漏及影响


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

内存泄漏会导致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检测定位内存问题。

相关文章

网友评论

  • 午马丶:你好为什么 ,我的leaks的左侧没有你的设置栏啊
  • 少_荃:为什么我找不到Display Setting面板,我用的的是Xcode8.3,就是找不到这个面板,好郁闷
  • LV大树:666666666
  • astring:你好为什么我一运行leaks 就闪退
    8659b2865680:@astring 我用的是MacPro啊,不过是128G的,目前只有20G可用了,leaks测试一跑真机就闪退,模拟器不会
    astring:@静坐_常思己过 电脑内存不够,你也用mini4g的吧?赶紧换个电脑吧
    8659b2865680:我的模拟器时不会出现该问题,一旦切换到真机就会闪退,请问你的解决了吗
  • 六六左边走:我也定位不到具体代码
  • 6a825ffb0ed3:您好我想问下,我是arc 当我点击红叉的时候没法定位到具体的函数啊,这是怎么回事呢?请教一下,谢谢,如果方便留个联系方式,我q,326201160谢谢啦
  • ShineLing:您好, 请教您一个问题, 是有关 leaks 的. 我今天在做内存检测的时候, 发现 leaks 里面少了一个 齿轮 样式的按钮, 在这个里面 有 invert call tree 和 hide system libraries这几个选项. 正常情况下 小齿轮 旁边有两个按钮, 也就是说有三个按钮. 现在少了这个...
    xcode版本是8.3.1 请问 您遇到过这个情况吗?
    CoderHw:我也碰到你这个情况,后来找到这个按钮了没?
    ShineLing:@程序媛coco 谢谢
    程序媛coco:选择Call Trees 之后 在底部的工具view中就有Call Tree的选项
  • 包建强1982:- (NSDictionary*)updateTimestampFrom2:(NSMutableDictionary*)dict
    {
    NSString* EXPIRED = @"EXPIRED";
    NSString* OL = @"OL";
    NSString* DURATION = @"DURATION";

    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];
    }
  • 我是卖报滴小行家:为什么在arc下也会报错,定位到:WKWebView *aboutWebview = [[WKWebView alloc] initWithFrame:self.view.bounds];
    6a40e57ba3d0:同问,兄弟最后是怎么解决的?
  • dragonYao:定位到的是地址信息
  • 7e33bcf02f7f:你好,问下这个xcode8可以这样做吗
    smartkeyi:@恏玖芣见 可以的
  • itzhangbao:帅比楼主!我的Call Tree 怎么不可选啊
    f2efbe56c720:@s6060304 感谢! :blush:
    8e78b5b03b17:Instruments面板的左邊中間有個Detail > Leaks
    將Leaks改為Call Tree,他是選單類的
    只有做完這個動作時,setting - Call Tree那個分類的選項才會生效。
    這時也才能用文章內的方法進行觀察
    1460d4904512:@秋天的阳光 我的也不能选,你的现在好了吗
  • 8e09d8f4f082:你好,请问一下,我用leaks定位故障代码,出来的是汇编,这是怎么回事
    ShineLing:@34码的小孩子 在buildsetting中的debug information format 中选择DWARF with dSYM File选项,即生成相应的dSYM文件,使用检测工具的时候能够找到相关的dSYM文件
    34码的小孩子:你好,请问你解决了没?我也遇到这个情况。发现里面xcode的标志不可用了:joy: 按照网上有的人说将build setting 的 debug information format 选择第二项,试了也没用。
  • 88dc77c46a87:ARC情况下,能检测到内存泄漏吗?有那些case这种方法是不能检测到的呢?

本文标题:使用Instruments定位iOS应用的Memory Leak

本文链接:https://www.haomeiwen.com/subject/kytohttx.html