我有一个使用Swift编写的iOS应用程序存在内存泄漏问题 - 在某些情况下,一些对象应该被释放但并没有被释放。通过添加类似于 deinit
的调试消息,我已经了解到了这个问题:
deinit {
println("DEINIT: KeysProvider released")
}
因此,在应该导致对象释放的事件之后,deinit消息应该出现在控制台中。然而,对于一些应该被释放的对象,该消息却丢失了。尽管如此,Leaks开发者工具并未显示任何泄漏。我该如何解决这种情况?
我有一个使用Swift编写的iOS应用程序存在内存泄漏问题 - 在某些情况下,一些对象应该被释放但并没有被释放。通过添加类似于 deinit
的调试消息,我已经了解到了这个问题:
deinit {
println("DEINIT: KeysProvider released")
}
因此,在应该导致对象释放的事件之后,deinit消息应该出现在控制台中。然而,对于一些应该被释放的对象,该消息却丢失了。尽管如此,Leaks开发者工具并未显示任何泄漏。我该如何解决这种情况?
请查看苹果公司的《诊断和解决运行应用中的错误:可视化和诊断内存使用量增加》。
只需在左侧面板中找到您认为应该被释放的对象,它就会显示对象图(显示在主画布上方)。这非常有用,可以快速确定在疑问对象上建立强引用的位置。从这里开始,您可以开始研究,诊断为什么这些强引用没有被解决(例如,如果疑问对象从其他应该被释放的东西中获得了强引用,请查看该对象的图表,您可能会发现问题(例如,强引用循环,重复定时器等)。
请注意,在右侧面板中,我正在查看调用树。我通过在方案设置中打开“malloc stack”日志记录选项来获得它:
无论如何,完成这一步后,您可以单击第一个屏幕截图右侧面板中显示的堆栈跟踪中相关方法调用旁边的箭头,然后您可以查看最初建立该强引用的位置:如需更多关于使用Instruments跟踪内存问题的信息和演示,请参考以下内容:
deinit
,就不会调用它。你需要一个更好的测试来检测内存泄漏。 - zaph