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. zepto - push

    var arr = ['1', '2', '3', '4']; arr.push('qwe'); console.log(arr);

  2. Linux下U盘变成只读

    今天用Ubuntu给同学拷贝数据的时候,突然其中一个文件夹U盘就不能复制和删除了.再windows7下可以删除除修改的那个文件夹之外的数据,但修改的那个文件夹死活删除不掉,只读属性也去不掉.再Ubun ...

  3. Fast Image Cache – iOS 应用程序高性能图片缓存

    Fast Image Cache 是一种在 iOS 应用程序中高效.持续.超快速的存储和检索图像的解决方案.任何良好的 iOS 应用程序的用户体验都应该是快速,平滑滚动的,Fast Image Cac ...

  4. Nginx+CI出现404错误

    最近刚学ci框架,做了个简单的项目,在本地搭服务器的环境都调通了,但是部署到远程服务器时: http://example.com/(index.php)/ 可以访问(为配置的默认controller- ...

  5. Java 常用字符串操作总结

    1. String转ASCII码 public static String stringToAscii(String value) { StringBuffer sbu = new StringBuf ...

  6. Android 学习笔记之ContentProvider实现数据共享....

    PS:最近听老师说打算让我参与企业的app制作,让我加快学习的进度...好吧,貌似下周还有考试...貌似实验室这个app也要做...暂时不管了...那就只能加快进度了,感觉略微的有点激动和紧张,总算是 ...

  7. Mysql中的各种timeout

    在使用MySQL的过程中,你是否遇到了众多让人百思不得其解的Timeout?那么这些Timeout之后,到底是代码问题,还是不为人知的匠心独具?本期Out-man,讲述咱们MySQL DBA自己的Ti ...

  8. Week2 Bing词典Android客户端案例分析

    一.软件调研 运行平台:Android 4.4.4 必应版本:5.2.2 1.bug发现 1.1 bug标题:单词挑战无法加载和刷新 bug详细描述:学习界面中的单词挑战模块,点击后没有任何反映,并且 ...

  9. DOM中 property 和 attribute 详解

    被问到 property 和 attribute 的区别,想来也是要好好看一下. 一.基本概念区别 其实Attribute和Property这两个单词,翻译出来都是“属性”,<js高级程序设计& ...

  10. P6 EPPM R16.1安装与配置指南(一)

    标题 http://www.cnblogs.com/endv/p/5634620.html 安装与配置指南安装与配置指南(数据库)说明哪些How to set up the P6专业数据库和服务器.a ...