我有写在斯威夫特的iOS应用程序正在泄漏内存 - 在某些情况下某些对象应该被释放,但事实并非如此。 我已经通过简单地增加了解了问题deinit
调试消息是这样的:
deinit {
println("DEINIT: KeysProvider released")
}
因此,DEINIT消息应该应该使对象发布此类事件后出现在控制台中。 然而,对于一些对象应被释放,该消息被丢失。 尽管如此,泄漏开发工具不显示任何泄漏。 如何解决这样的情况?
我有写在斯威夫特的iOS应用程序正在泄漏内存 - 在某些情况下某些对象应该被释放,但事实并非如此。 我已经通过简单地增加了解了问题deinit
调试消息是这样的:
deinit {
println("DEINIT: KeysProvider released")
}
因此,DEINIT消息应该应该使对象发布此类事件后出现在控制台中。 然而,对于一些对象应被释放,该消息被丢失。 尽管如此,泄漏开发工具不显示任何泄漏。 如何解决这样的情况?
在Xcode中8,你可以点击“调试内存图形”按钮, 调试工具栏(在屏幕的底部示出):
只要确定在左侧面板,你认为应该已经释放的对象,它会告诉你的对象图(在主画布显示,上文)。 这是快速识别其中的强引用是有问题的对象上建立非常有用的。 从这里,你就可以开始你的研究,诊断为什么这些强引用未解决(例如,如果有问题的对象已经从别的东西,应该已经释放一个有力的参考,看看那个对象的图形,也和你可能会发现问题(例如参照强周期,重复定时器等)。
请注意,在右侧面板中,我看到调用树。 我认为通过打开该计划设置的“叠的malloc”记录选项:
无论如何,已经这样做了,那么就可以点击旁边的箭头上面的第一个屏幕快照的右侧面板中的堆栈跟踪显示相关的方法调用,你能看到的是很强的借鉴最初成立:
上述存储器诊断技术(和更多)被证实在WWDC 2016的后一部分在Xcode视觉调试 。
传统仪器技术(如果使用旧版本的Xcode特别有用)进行说明,在我原来的答复。
我会建议使用仪器的‘分配’工具与‘记录引用计数’功能:
然后,您可以运行在仪器的应用程序,然后搜索你的类,你知道泄漏并通过点击箭头钻:
然后,您可以深入到细节,并使用右侧的“扩展详细信息”面板在堆栈跟踪一下:
在“扩展详细信息”面板,专注于你的代码中的黑色,而不是系统的灰色调用。 总之,从“扩展详细信息”面板,然后你可以深入到你的源代码,就在仪器::
欲了解更多信息,并使用仪器来跟踪内存问题的示威,请参考:
使用的仪器来检查泄漏和因保留,但不会泄漏的内存记忆丧失。 后者是未使用的内存仍指向。 在仪器的分配仪器使用标记生成(Heapshot)。
至于如何使用Heapshot查找内存creap,请参阅: bbum博客
基本方法是运行仪器分配工具,取heapshot,运行代码的迭代,并采取另一heapshot重复3或4次。 这将表明,分配和迭代过程中不会释放内存。
为了弄清楚结果透露给看个人的分配。
如果你需要看到保留,发布和自动释放出现一个对象使用的仪器:
在仪器运行,在设定“记录的引用计数”的分配(对于Xcode中5,并降低你必须停止记录设置的选项)。 导致应用程序运行,停止录音,深入,你将能够看到所有保留,发布和自动释放发生。