泄漏仪器不显示时如何debugging内存泄漏?

我有一个用Swift编写的iOS应用程序正在泄漏内存 – 在某些情况下,应该释放一些对象,但它们不是。 我已经通过简单地添加deinitdebugging消息来了解这个问题:

 deinit { println("DEINIT: KeysProvider released") } 

所以,在应该导致对象释放的事件之后,deinit消息应该出现在控制台中。 但是,对于一些应该发布的对象,则缺less该消息。 尽pipe如此,泄漏开发工具并没有显示任何泄漏。 我如何解决这种情况?

在Xcode 8中,你可以点击“Debug Memory Graph”button, debugmemorygraphbutton 在debugging工具栏(显示在屏幕的底部):

调试内存图

只需确定左侧面板中您认为应该被释放的对象,它就会显示对象图(如上图所示)。 这对于快速确定在所讨论的对象上build立强引用的位置非常有用。 从这里,你可以开始你的研究,诊断为什么那些强引用没有被parsing(例如,如果这个对象有一个应该被释放的东西的强大的引用,那么看看这个对象的图,你也可以find问题(例如强参考周期,重复计时器等)。

请注意,在右侧面板中,我正在看到呼叫树。 我打开scheme设置中的“malloc堆栈”日志logging选项:

malloc堆栈

无论如何,只要点击上面第一个屏幕快照右侧面板堆栈跟踪中显示的相关方法调用旁边的箭头,就可以看到最初build立的强引用的位置:

码

上面的内存诊断技术(以及更多)在WWDC 2016 Visual Debug的Xcode后期部分中进行了演示。


传统的仪器技术(特别是如果使用旧版本的Xcode很有用)在我的原始答案中描述如下。


我build议使用“logging引用计数”function使用仪器的“分配”工具:

记录引用计数

然后,您可以在乐器中运行应用程序,然后通过单击箭头search您知道正在泄漏并钻入的课程:

在这里输入图像描述

然后,您可以钻取详细信息,并使用右侧的“扩展详细信息”面板查看堆栈跟踪:

扩展的细节

在“扩展详细信息”面板中,将您的代码以黑色为重点,而不是灰色的系统调用。 无论如何,从“扩展详细信息”面板,您可以钻入您的源代码,正确的在仪器::

你的代码

有关使用仪器查找内存问题的更多信息和演示,请参阅:

  • WWDC 2013video修复内存问题
  • WWDC 2012videoiOS应用程序性能:内存

使用仪器检查由于保留但未泄漏的内存而导致的泄漏和内存丢失。 后者是尚未使用的内存,仍然指向。 在仪器上的分配仪器中使用标记生成(Heapshot)。

有关如何使用Heapshot查找内存升级,请参阅: bbum博客

基本上这个方法是运行Instruments分配工具,获取heapshot,运行你的代码迭代,并重复3或4次heapshot。 这将指示在迭代过程中分配和释放的内存。

要弄清楚结果披露,看个人的分配。

如果您需要查看对象使用工具的保留,发布和自动释放的位置:

在仪器上运行,在Allocations中设置“logging参考计数”(对于Xcode 5及更低版本,您必须停止logging以设置选项)。 导致应用程序运行,停止logging,向下钻取,您将能够看到所有保留,发布和autoreleases发生。