Instruments指南:如何调试内存泄露

开篇

现在,你应该使用的ARC,而不是原来我们使用的MRC或者其他。但是我们在使用ARC的时候也会出现内存泄露的情况。

幸运的是,苹果为我们提供了Instruments,他可以用来检测你的应用程序的内存泄露。可能刚学习iOS开发的开发者被这个工具给吓到了,里面有太多东西了。其实他们是非常了不起的,而且也非常容易使用。

在这篇文章里,你将会通过使用XCode和Instruments来调试和发现内存相关的问题(例如内存泄露)。

开始使用

我们这篇文章的目标就是用一个小demo应用程序检查和解决我们经常遇到的通常的内存相关的错误。demo下载地址:http://pan.baidu.com/s/1c0tvFGk (参考别人的,比较老)

打开Xcode,然后运行小demo,试着去点击几个cell,我们会发现它爆了,你得到的是一个可怕地EXC_BAD_ACCESS错误,调试器没有什么帮助去解决这个错误。

对于许多开发者来说这是很令人沮丧的。因为不清楚问题出在哪里。下面是给开发者的一些建议当你遇到EXC_BAD_ACCESS错误的时候:

  • 设置Enable Zombie Objects参数,在可执行选项,这有时候有助于缩小问题原因。具体设置方法是点击运行右边的项目,然后选择Edit Scheme。在Run选项的Diagnositics中设置Enable Zombie Objects。然后Close。再次运行,可能会出现一些问题提示。
  • 使用苹果的Instruments,例如Leaks来查看内存问题。
  • 在你的代码中设置断点,然后一步一步执行直到接近crash的地方。
  • 尝试注释掉相关的代码,然后直到它工作,然后回溯。

僵尸入侵

不幸的是,NSZombieEnabled选项没有对僵尸启示做任何事情,所以你可以抛弃这种方法了。当你使用ENable Zombie Objects时,我们再次运行APP,会发现有下列提示:

2015-08-08 21:37:28.657 PropMemFun[8190:3281809] *** -[CFString respondsToSelector:]: message sent to deallocated instance 0x7f8251c07890

这时候我们会定位到这句代码:

 NSString * message = [NSString stringWithFormat:@"Last sushi: %@.  Cur sushi: %@", _lastSushiSelected, sushiString];

Bingo!这时候我们知道问题在这行,一个消息发送给了一个已经释放的string。这行使用了_lastSushiSelected和sushiString。此时sushiString是正常的因为我们在上边定义了。那么问题就可能出现在_lastSushiSelected上。因为sushiString是自动释放变量,所以_lastSushiSelected指向他的时候已经被释放了。因此添加

   _lastSushiSelected = [sushiString retain];

即可解决问题。再次运行发现问题解决。

Build,Analyze 和Recognize

没有了Crash我们现在看一下是否有内存泄露。通过Product-->Analyze,我们可以看到有两处内存泄露。分别在

return cell;

- (void)viewDidUnload {
[_sushiTypes release];
_sushiTypes = nil;
}

泄露和水管工(Leaks and Plumbers)

现在我们就使用Instruments。

  • 第一步:首先我们打开Instruments。(按着control+空格键,输入instruments即可打开(也可以Product-->Profile打开)我这边测试用Product-->Profile打开不能定位带具体内存泄露代码)。
  • 第二步:选择Leaks,然后Choose。
  • 第三步:通过暂停右边的选择我们可以选择正在运行的程序。然后点击Record(红色圆圈按钮)
  • 第四步:观察,我们可以发现在Leaks里面有一个红色圆柱,这说明了我们的APP存在内存泄露。
  • 第五步:点击暂停,然后我们开始分析。

    在Instruments下方的控制台中,我们把Leaks(如果是Allocation就点击选择Leaks)右边的选项Statistics选择为Call Trees。然后点击右边Call Tree设置,勾选Invert Call Tree 和Hide System Libraries。我们会发现显示出来的是一个消息名称。它将会带你到内存泄露的地方。双击那个消息即可。然后你就可以检查一下那里的代码,然后思考一下,你应该能发现和解决这个问题。然后解决过后重新运行Leaks去检测是否还会有内存泄露。

总结

以上就是利用Instruments如何查找内存泄露。

Instruments指南:如何调试内存泄露的更多相关文章

  1. Android学习系列(37)--App调试内存泄露之Context篇(下)

    接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...

  2. 使用Xcode7的Instruments检测解决iOS内存泄露

    文/笨笨的糯糯(简书作者)原文链接:http://www.jianshu.com/p/0837331875f0著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 作为一名iOS开发攻城狮, ...

  3. 使用Xcode8的Instruments检测解决iOS内存泄露(leak)

    在苹果没有出ARC(自动内存管理机制)时,我们几乎有一半的开发时间都耗费在这么管理内存上.后来苹果很人性的出了ARC,虽然在很大程度上,帮助我们开发者节省了精力和时间.但是我们在开发过程中,由于种种原 ...

  4. (转载--修改)使用Xcode9的Instruments检测解决iOS内存泄露

    作为一名iOS开发攻城狮,在苹果没有出ARC(自动内存管理机制)时,我们几乎有一半的开发时间都耗费在这么管理内存上.后来苹果很人性的出了ARC,虽然在很大程度上,帮助我们开发者节省了精力和时间.但是我 ...

  5. [Swift通天遁地]七、数据与安全-(12)使用Instruments Leaks工具检测内存泄露

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. Android学习系列(36)--App调试内存泄露之Context篇(上)

    Context作为最基本的上下文,承载着Activity,Service等最基本组件.当有对象引用到Activity,并不能被回收释放,必将造成大范围的对象无法被回收释放,进而造成内存泄漏. 下面针对 ...

  7. [Android Memory] App调试内存泄露之Context篇(下)

    转载地址:http://www.cnblogs.com/qianxudetianxia/p/3655475.html 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用A ...

  8. [Android Memory] App调试内存泄露之Context篇(上)

    转载自:http://www.cnblogs.com/qianxudetianxia/p/3645106.html Context作为最基本的上下文,承载着Activity,Service等最基本组件 ...

  9. Delphi EurekaLog 调试内存泄露方法

    要使用EurekaLog进行内存泄露检测,需要手动开启"EurekaLog Options..."下的"Advanced Options"旁的"Mem ...

随机推荐

  1. Javascript倒计时组件new TimeSpan(hours, minutes, minutes)

    function TimeSpan(h, m, s) { this.h = Number(h); this.m = Number(m); this.s = Number(s); } TimeSpan. ...

  2. 超实用的8个Linux命令行性能监测工具

    http://www.csdn.net/article/2012-09-17/2810047-command-line-tools-to-monitor-linux-perf 你值得拥有:25个Lin ...

  3. 2014 网选 上海赛区 hdu 5047 Sawtooth

    题意:求n个'M'型的折线将一个平面分成的最多的面数! 思路:我们都知道n条直线将一个平面分成的最多平面数是 An = An-1 + n+1 也就是f(n) = (n*n + n +2)/2 对于一个 ...

  4. Oracle 给已创建的表增加自增长列

    对于已经创建的表,在特殊需求下,需要增加一个自增长列步骤: --1. 增加 自增长列 ); --2. 程序方式更新设置 IdNum 列 值 --3.查询最大 ) From Limsbusinessen ...

  5. ionic 实现自动升级APP

    最近做移动商城开发,需要一个自动升级APP的功能,在网上搜罗很多,发现有的是下载APK,有的在我这服务无法实现,由于时间原因,都被PASS了,最后找到了一个热更新插件,经过半天的调试,可以使用,很欣喜 ...

  6. Java 集合系列14之 Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)

    概要 学完了Map的全部内容,我们再回头开开Map的框架图. 本章内容包括:第1部分 Map概括第2部分 HashMap和Hashtable异同第3部分 HashMap和WeakHashMap异同 转 ...

  7. Android 开发有用代码积累

    Android开发需求变化快,开发周期要求尽量短,接下来一系列文章从实际使用出发总结一些常用的代码片段,便于查找,也为后来人提供一份参考. 1.获取Manifest的基本信息(升级页面和软件关于页面一 ...

  8. [New Portal]Windows Azure Virtual Machine (10) 自定义Windows Azure Virtual Machine模板

    <Windows Azure Platform 系列文章目录> 通过之前的文章,我相信大家对微软Windows Azure Virtual Machine有一定的了解了. 虽然微软提供了非 ...

  9. JS魔法堂:那些困扰你的DOM集合类型

    一.前言 大家先看看下面的js,猜猜结果会怎样吧! 可选答案: ①. 获取id属性值为id的节点元素 ②. 抛namedItem is undefined的异常 var nodes = documen ...

  10. myeclipse怎么github

    myeclipse怎么github 第一步.打开myeclipse->选择项目->鼠标右键->Team->Share project,将出现如下图所示: 第二步.选择git,在 ...