iOS性能调优iOS性能优化相关iOS测试发布相关

使用MsLeak以及Instument调试解决iOS内存泄露

2016-05-09  本文已影响870人  慧众rodman

使用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

    参考范例如下

    辅助问题分析和定位

    一旦你知道它的存在泄露,这个工具可以让你调试泄漏。可以考虑使用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崩溃时使用。

    上一篇下一篇

    猜你喜欢

    热点阅读