使用MsLeak以及Instument调试解决iOS内存泄露
使用MsLeak以及Instument调试解决iOS内存泄露
工具和描述参考网络内容整理,http://www.raywenderlich.com/
补充MSleakHunter demo说明
rodman整理
虽然iOS 5.0版本之后加入了ARC机制,由于相互引用关系比较复杂时,内存泄露还是可能存在。你要相信我,做一个app终归是会比较复杂的。
这里收集传统常用的Xcode和Instruments定位方法,以及新秀内存泄露定位工具MSleakHunter。
使用Xcode和Instruments调试解决iOS内存泄露
运行Demo
先下载一个实现准备好的内存泄露的Demo吧:leakapp
下载下来,打开运行,程序是一个寿司的列表,列出各种寿司卷。试着选择里面的几行,应该是选第二行的时候就崩溃了。崩溃截图:
在build Phases中修改leaker hunter相关的M文件不使用arc
在AppDelegate文件中引用leakHunter,并做初始化
参考代码:
#import "MSLeakHunter.h"
#import "MSViewControllerLeakHunter.h"
#import "MSViewLeakHunter.h"
#import “MSZombieHunter.h"
#if MSLeakHunter_ENABLED
[MSLeakHunter installLeakHunter:[MSViewControllerLeakHunter class]];
#endif
#if MSViewLeakHunter_ENABLED
[MSLeakHunter installLeakHunter:[MSViewLeakHunter class]];
#endif
确保MSVCLeakHunter.h中,MSVCLeakHunter_ENABLED 被设置为1
参考范例如下
辅助问题分析和定位
- 启动app并配合xCode查看运行状况,如下图一能看到内存的使用数值和走势,下图二会打印可能存在内存泄露的嫌疑内容。
- 内存有持续增长,且提示有泄露时,可以考虑使用LeakHunter提供的方法打断点
一旦你知道它的存在泄露,这个工具可以让你调试泄漏。可以考虑使用LeakHunter打断点提供了一个非常简单的方法使调试器停止在你关注的对象上。在msleakhunterretainbreakpointshelper.H中,用此方法监视你要的对象。可以帮助你找出额外的-retain调用,或谁在保留对象但不释放它.
ms_enablememorymanagementmethodbreakpointsonobject(object)在调用-retain, -release, -autorelease, 或者-dealloc释放该对象后,调试器将停止应用监控。此时如果查看堆栈,可以看到在你的应用程序中谁造成调用这些方法,这能帮助你调试内存管理的问题。
注:msleakhunterretainbreakpointshelper已经被编译non arc。如果您的项目ARC,请参阅本指南点击查看,以了解如何禁用该文件。
MSZombieHunter的使用
MSZombieHunter默认是nszombieenabled,你可以通过以下方法启用他
+[MSZombieHunter enable];
开启之后,一旦被监控的对象释放,MSZombieHunter会抛出exception,方便你立即捕获。
重要说明
使mszombiehunter使所有对象收到dealloc消息仍旧保持存活,成倍增加了应用程序的内存使用情况。因为这个原因,只是建议在模拟器上启用它,或者当你试图调试一个exc_bad_access崩溃时使用。