我有一个用Swift编写的iOS应用程序,它正在泄漏内存-在某些情况下,一些对象应该被释放,但它们没有释放。我通过简单地添加如下的deinit调试消息来了解这个问题:
deinit {
println("DEINIT: KeysProvider released")
}因此,在发生导致对象释放的事件后,deinit消息应该出现在控制台中。但是,对于一些应该释放的对象,缺少该消息。尽管如此,leaks Tool没有显示任何泄漏。我该如何解决这种情况?
发布于 2015-06-23 11:42:46
在Xcode8中,您可以单击"Debug Memory Graph“按钮,

在调试工具栏(显示在屏幕底部)中:

只需在左侧面板中确定您认为应该释放的对象,它将向您显示对象图(如上图的主画布所示)。这对于快速识别在相关对象上建立强引用的位置非常有用。从这里,你可以开始你的研究,诊断为什么这些强引用没有被解决(例如,如果有问题的对象有来自其他应该被释放的对象的强引用,也可以查看该对象的图,你可能会发现问题(例如,强引用周期,重复计时器等)。
请注意,在右侧面板中,我看到了调用树。我是通过在方案设置中打开"malloc stack“日志记录选项来实现的:

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

在我最初的回答中,下面描述了传统的Instruments技术(如果使用旧版本的Xcode,则特别有用)。
我建议使用Instruments的“分配”工具和“记录引用计数”功能:

然后,您可以在Instruments中运行应用程序,然后搜索您知道正在泄漏的类,并通过单击箭头深入查看:

然后,您可以深入查看详细信息,并使用右侧的"Extended Details“面板查看堆栈跟踪:

在“扩展详细信息”面板中,将重点放在黑色代码上,而不是灰色的系统调用上。无论如何,从"Extended Details“面板中,您可以钻取源代码,就在Instruments::

有关使用Instruments跟踪内存问题的更多信息和演示,请参阅:
视频WWDC 2021视频Detect and diagnose memory issues
https://stackoverflow.com/questions/30992338
复制相似问题