Instruments指南:如何调试内存泄露
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指南:如何调试内存泄露的更多相关文章
- Android学习系列(37)--App调试内存泄露之Context篇(下)
接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...
- 使用Xcode7的Instruments检测解决iOS内存泄露
文/笨笨的糯糯(简书作者)原文链接:http://www.jianshu.com/p/0837331875f0著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 作为一名iOS开发攻城狮, ...
- 使用Xcode8的Instruments检测解决iOS内存泄露(leak)
在苹果没有出ARC(自动内存管理机制)时,我们几乎有一半的开发时间都耗费在这么管理内存上.后来苹果很人性的出了ARC,虽然在很大程度上,帮助我们开发者节省了精力和时间.但是我们在开发过程中,由于种种原 ...
- (转载--修改)使用Xcode9的Instruments检测解决iOS内存泄露
作为一名iOS开发攻城狮,在苹果没有出ARC(自动内存管理机制)时,我们几乎有一半的开发时间都耗费在这么管理内存上.后来苹果很人性的出了ARC,虽然在很大程度上,帮助我们开发者节省了精力和时间.但是我 ...
- [Swift通天遁地]七、数据与安全-(12)使用Instruments Leaks工具检测内存泄露
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Android学习系列(36)--App调试内存泄露之Context篇(上)
Context作为最基本的上下文,承载着Activity,Service等最基本组件.当有对象引用到Activity,并不能被回收释放,必将造成大范围的对象无法被回收释放,进而造成内存泄漏. 下面针对 ...
- [Android Memory] App调试内存泄露之Context篇(下)
转载地址:http://www.cnblogs.com/qianxudetianxia/p/3655475.html 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用A ...
- [Android Memory] App调试内存泄露之Context篇(上)
转载自:http://www.cnblogs.com/qianxudetianxia/p/3645106.html Context作为最基本的上下文,承载着Activity,Service等最基本组件 ...
- Delphi EurekaLog 调试内存泄露方法
要使用EurekaLog进行内存泄露检测,需要手动开启"EurekaLog Options..."下的"Advanced Options"旁的"Mem ...
随机推荐
- Hql查询结果动态组装 List(map),List(bean),List(list),List(set)等格式(转)
1.//查询整个对象String hql="from Users";Query query = session.createQuery(hql);List<Users> ...
- Unity3D 游戏开发之内存优化
项目的性能优化主要围绕CPU.GPU和内存三大方面进行. 无论是游戏还是VR应用,内存管理都是其研发阶段的重中之重. 然而,在我们测评过的大量项目中,90%以上的项目都存在不同程度的内存使用问题.就目 ...
- 扁平化设计的最新趋势 – 长阴影(Long Shadow)
随着互联网的发展,网页设计变得越来越复杂,如今设计的外观和感觉实现网站功能说使用的开发技术一样重要.互联网的功能远远不只是基本的信息共享,现在人们对网站的期望是远远大于几年前的. 如今,HTML5 & ...
- android高级---->AsyncTask的源码分析
在Android中实现异步任务机制有两种方式,Handler和AsyncTask,它在子线程更新UI的例子可以参见我的博客(android基础---->子线程更新UI).今天我们通过一个小的案例 ...
- Android学习笔记之蓝牙通信...
PS:最近同学问我蓝牙的事,因此自己也就脑补了一下蓝牙... 学习内容: 1.如何实现蓝牙通信技术... 蓝牙通信其实是手机里很常用的一种通信方式,现在的手机中是必然存在蓝牙的,蓝牙通信也是有一部 ...
- .NET ORM 哪家强
ORM到底哪家强? 很多人都想知道这个问题,自已也没测试过,只能道听途说. 闲的无聊就将几个ORM拿出来比一比,假如怀疑测试代码有问题可以将它下载下来慢慢研究. 参赛ORM 1.SqlSugar:是一 ...
- 分享一个ASP.NET 文件压缩解压类 C#
需要引用一个ICSharpCode.SharpZipLib.dll using System; using System.Collections.Generic; using System.Linq; ...
- Win10 + VS2015 下编译 Qt5.6.0
近期由于另外一个项目需要用 vs2015 ,于是把 Qt 也升级到了 5.6.0 .由于项目需要兼容 Windows xp ,所以需要自己编译 Qt .这里大致整理一下编译的过程. 安装 Active ...
- mysqlbinlog -v --base64-output 与不加的区别
加-v与加-vv的区别: 加--base64-output=DECODE-ROWS与不加的区别:
- 基于GTID Replication主从数据不一致操作
基本的M-S结构 现在master与slave主机数据一致: mysql> select * from t1; +------+ | id | +------+ | 1 | | ...