梗概:
1、Xcode内存图调试器是什么?
2、如何使用它,以及一些提示。
3、它的利弊。
一、Xcode内存图调试器是什么?
Xcode内存图调试器有助于查找和修复保留周期和泄漏的内存。激活后,它会暂停应用程序执行,并显示当前堆上的对象及其关系以及哪些引用使它们保持活动状态。
二、如何使用它?
识别保留周期和内存泄漏的3个快速步骤:
(1)通过Xcode方案编辑器选择堆栈日志记录集成(Product —> Scheme — > Edit Scheme),如下所示:
注意:我们仅启用“实时分配”的日志记录。在调试时,这比“All Allocations”的开销要低,而且我们需要识别保留周期和泄漏。
(2)执行您想要分析的任何应用程序操作(您怀疑导致保留周期和泄漏的操作),并通过选择其调试栏按钮进入内存图调试模式:
(3)内存图调试器暂停应用程序执行并显示以下内容:
从上图我们可以看到根据颜色绘制图片的方法暴露泄漏问题,原因如下:
绘图操作还原时会引起内存暴增,目前在做绘图板,每画一笔需要生成一张图片然后销毁, 这时生成图片的内存是没有问题的, 但若用这些点的集合在另一端进行还原操作,就会在1秒内调用多次画笔去还原路径生成图片导致内存暴增。
(1)是画笔点的集合存储过多,应进行限制
(2)是生成图片时图片没有及时释放导致内存暴增问题
而使用UIGraphicsGetImageFromCurrentImageContext( )方法返回的图片对象时内存管理方式是autorelease,所以此对象会在离它最近的自动释放池释放(延迟释放),xCode则把他标识为可能出现泄漏的对象。若担心此方法调用频繁引起短时间内存没有释放,可将此方法的实现代码放于【 @autoreleasepool{ 实现代码} 】中。虽然处理后还是有警告,但是我们已经处理了让image的内存尽快释放,解决引起内存暴增问题。
备注:调试导航器出现叹号的即为可能出现内存泄漏的地方;我们可以选择其中一个地址,通过右侧的回调栈信息查看源码。
三、优缺点
优点:我们可以找到一些易于识别的泄漏(简单的保留周期)。例如 - 在关闭属性中捕获自身的对象。使用闭包捕获列表可以轻松修复此问题,以便弱捕获引用。
缺点:误报(这是泄漏吗?),泄漏的精确性。例如:当某个数组存储一堆对象时,它也可能把你识别成泄漏。一般由两个对象循环引用的内测泄漏是比较好发现的,如果是由三个及其三个以上的对象形成的大的循环引用,就会比较难排查了。