美文网首页iOS 的那些事儿
iOS - 使用Xcode Memory Graph Debug

iOS - 使用Xcode Memory Graph Debug

作者: 墨香茉香 | 来源:发表于2018-10-27 11:40 被阅读0次

    梗概:

    1、Xcode内存图调试器是什么?
    2、如何使用它,以及一些提示。
    3、它的利弊。

    一、Xcode内存图调试器是什么?

    Xcode内存图调试器有助于查找和修复保留周期和泄漏的内存。激活后,它会暂停应用程序执行,并显示当前堆上的对象及其关系以及哪些引用使它们保持活动状态。

    二、如何使用它?

    识别保留周期和内存泄漏的3个快速步骤:
    (1)通过Xcode方案编辑器选择堆栈日志记录集成(Product —> Scheme — > Edit Scheme),如下所示:


    配置.png
    注意:我们仅启用“实时分配”的日志记录。在调试时,这比“All Allocations”的开销要低,而且我们需要识别保留周期和泄漏。
    

    (2)执行您想要分析的任何应用程序操作(您怀疑导致保留周期和泄漏的操作),并通过选择其调试栏按钮进入内存图调试模式:


    查看实时内存图.png

    (3)内存图调试器暂停应用程序执行并显示以下内容:


    实时内存分部图.png
    可能出现内存泄漏.png

    从上图我们可以看到根据颜色绘制图片的方法暴露泄漏问题,原因如下:
    绘图操作还原时会引起内存暴增,目前在做绘图板,每画一笔需要生成一张图片然后销毁, 这时生成图片的内存是没有问题的, 但若用这些点的集合在另一端进行还原操作,就会在1秒内调用多次画笔去还原路径生成图片导致内存暴增。
    (1)是画笔点的集合存储过多,应进行限制
    (2)是生成图片时图片没有及时释放导致内存暴增问题

    而使用UIGraphicsGetImageFromCurrentImageContext( )方法返回的图片对象时内存管理方式是autorelease,所以此对象会在离它最近的自动释放池释放(延迟释放),xCode则把他标识为可能出现泄漏的对象。若担心此方法调用频繁引起短时间内存没有释放,可将此方法的实现代码放于【 @autoreleasepool{ 实现代码} 】中。虽然处理后还是有警告,但是我们已经处理了让image的内存尽快释放,解决引起内存暴增问题。


    代码片段.png
    备注:调试导航器出现叹号的即为可能出现内存泄漏的地方;我们可以选择其中一个地址,通过右侧的回调栈信息查看源码。
    
    三、优缺点
    优点:我们可以找到一些易于识别的泄漏(简单的保留周期)。例如 - 在关闭属性中捕获自身的对象。使用闭包捕获列表可以轻松修复此问题,以便弱捕获引用。
    
    缺点:误报(这是泄漏吗?),泄漏的精确性。例如:当某个数组存储一堆对象时,它也可能把你识别成泄漏。一般由两个对象循环引用的内测泄漏是比较好发现的,如果是由三个及其三个以上的对象形成的大的循环引用,就会比较难排查了。
    

    相关文章

      网友评论

        本文标题:iOS - 使用Xcode Memory Graph Debug

        本文链接:https://www.haomeiwen.com/subject/zzzrtqtx.html