如何检测 iPhone 上的内存泄漏?
Posted
技术标签:
【中文标题】如何检测 iPhone 上的内存泄漏?【英文标题】:How do you detect memory leaks on iPhone? 【发布时间】:2010-10-04 09:44:36 【问题描述】:我正在通过 Xcode 使用 Leaks Instruments 功能来(尝试)查找内存泄漏。我还没有弄清楚如何使用这个程序。我在程序中单击 Leaks 并看到内存在增加,因为我在模拟器中执行各种操作。我显示了扩展详细信息窗格。扩展详细信息窗格中唯一引用我的应用程序的是 main。与 Xcode 生成的 main 方法一样。其他一切都是 UIKit、Foundations 和其他我没有编写的 SDK 类。我的应用程序没有显示任何内容,我做错了什么?
在我达到 3 分钟之前,有超过 100 次泄漏,总计 2.5k。这种情况常见吗?
【问题讨论】:
您是查看实际的“泄漏”数据还是查看对象分配数据?如果您正在查看后者,那么是的,这很正常……那些不是泄漏,只是分配。它让您了解自己的内存占用情况。 我正在查看漏洞。我唯一的东西是主要的。随着我使用该应用程序,泄漏和字节的数量继续增加。我不明白 main 怎么会泄漏这么多。 确保所有的 alloc 都被释放。如果不是,您正在创建内存泄漏。 【参考方案1】:我写了一篇关于使用 Instruments 跟踪 iPhone 内存泄漏的教程。我不确定它是否会帮助你处理你正在处理的事情......不过,不会受伤。 :-)
http://www.streamingcolour.com/blog/tutorials/tracking-iphone-memory-leaks/
【讨论】:
不错的教程。请记住,如果您只是使用 Xcode 通过继续Help 并键入“Leaks” 来加载 Instruments,则可以跳过很多步骤。它将向您显示将加载所有设置的菜单选项。 这个链接失效了,请更新一下。【参考方案2】:在仪表板上将视图更改为“扩展细节”。这将在您停止记录并选择泄漏对象后向您显示每个泄漏对象的堆栈跟踪。
您确实看到了对 API 的调用,但您感兴趣的是在 API 调用之前找到应用程序的最后一个方法,这就是泄漏所在。
提示:在泄漏视图中打开“收集内存内容”。查看对象值也应该有助于找出问题所在。
您不希望有任何泄漏。 100 次泄漏不是典型的(至少在我的应用中);典型应该是 0。
【讨论】:
@Ben 谢谢。我会试试看。 @lajos 请看我说的部分,“我已显示扩展详细信息窗格”。【参考方案3】:我不熟悉如何使用 Leaks,但您可以随时尝试在您的代码上运行 Clang 分析器,看看是否会出现问题:http://clang.llvm.org/StaticAnalysis.html。它通常可以发现许多可能导致内存泄漏的错误。
【讨论】:
我下载了该工具,只是在其文档中发现它似乎与 XCode 中已包含的相同(使用“command-shift-a”执行)。是吗? 是的。一年半前,当我发布此内容时,它并未包含在 Xcode 中。【参考方案4】:Xcode:运行 -> 从性能工具开始 -> 泄漏
【讨论】:
【参考方案5】:请记住,模拟器可能会泄漏,而设备不会。曾经使用 UITableViewController 类遇到过这种情况。
【讨论】:
【参考方案6】:使用 LLVM/Clang 静态分析器。
【讨论】:
【参考方案7】:还请注意,泄漏工具不会向您显示对象被过度保留并仍然保留的实例。泄漏是应该放开的物体只是闲逛而没有人清理它们的情况。即使您认为它们应该消失,过度保留的对象也会被有效地保留 - 因此泄漏工具无法指出它们,因为它们仍然被引用并且没有办法将它们与仍然应该保留的对象区分开来。
要找到这些,请使用内存报告工具并确保在释放对象后内存使用量完全下降。如果你发现某些东西没有释放内存,你可以先在 dealloc 中放置断点,看看你期望看到的释放是否真的被释放了。
您需要查找这两种情况以保持干净的内存占用。
【讨论】:
好点!为了找到这些,我有时会向 dealloc 添加 NSLog 调用以打印保留计数。【参考方案8】:Run -> Start with Performance Tool -> Leaks
【讨论】:
【参考方案9】:要检测内存泄漏,您可以使用 Xcode 的“构建和分析”功能。
只需在 Xcode 菜单中选择 Build -> Build and Analyze。
【讨论】:
【参考方案10】:总结了主要的内存泄漏工具:http://bcaccinolo.wordpress.com/2010/09/15/iphone-essential-performance-tools-list/
【讨论】:
【参考方案11】:可以在 Xcode 中找到的泄漏应用程序:run -> Start with Performance Tool -> Leaks
。
可以在/Developer/Applications/Performance Tools
中找到 Apple 的 Instruments 实用程序。
【讨论】:
【参考方案12】:查找内存泄漏的最佳方法之一是选择产品-> 分析。左边的 Xcode 显示了您在哪个文件中存在内存泄漏。导致内存泄漏的变量是什么。这是查找内存泄漏的最佳方法之一。
【讨论】:
【参考方案13】:内存调试器(控制台上方的按钮,视图调试器旁边)也非常有用。 它会向您显示泄漏,并且您可以轻松地检查 /filter 对象是否仍在内存中而不应该在内存中。
【讨论】:
以上是关于如何检测 iPhone 上的内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章