繁体   English   中英

你如何检测 iPhone 上的内存泄漏?

[英]How do you detect memory leaks on iPhone?

我正在通过 Xcode 使用 Leaks Instruments 功能来(尝试和)查找内存泄漏。 我还没有弄清楚如何使用这个程序。 我在程序中单击 Leaks 并看到内存在我在模拟器中执行各种操作时增加。 我显示了扩展详细信息窗格。 Extended Detail 窗格中唯一引用我的应用程序的是 main。 就像在 Xcode 生成的 main 方法中一样。 其他一切都是 UIKit、Foundations 和其他我没有编写的 SDK 类。 我的应用程序没有显示任何内容,我做错了什么?

在我打 3 分钟之前,有超过 100 次泄漏,总计 2.5k。 这是常见的吗?

我写了一篇关于使用 Instruments 跟踪 iPhone 内存泄漏的教程。 我不确定它是否会帮助你解决你正在处理的问题......不过不会伤害。 :-)

http://www.streamingcolour.com/blog/tutorials/tracking-iphone-memory-leaks/

在仪器面板上将视图更改为“扩展细节”。 这将在您停止录制并选择泄漏对象后显示每个泄漏对象的堆栈跟踪。

您确实看到了对 API 的调用,但您感兴趣的是在 API 调用之前找到应用程序的最后一个方法,这就是泄漏所在。

提示:在泄漏视图中打开“收集内存内容”。 查看对象值也应该有助于找到问题所在。

你不想要任何泄漏。 100 次泄漏并不典型(至少在我的应用程序中;)典型应为 0。

Xcode:运行 -> 从性能工具开始 -> 泄漏

我不熟悉如何使用 Leaks,但您可以随时尝试在您的代码上运行 Clang 分析器,看看是否会出现任何问题: http : //clang.llvm.org/StaticAnalysis.html 它通常可以找到许多可能导致内存泄漏的错误。

请记住,当设备不会泄漏时,模拟器可能会泄漏。 使用 UITableViewController 类已经遇到过一次。

使用 LLVM/Clang 静态分析器。

另请注意,泄漏工具不会向您显示对象被过度保留并仍然保留的实例。 泄漏是指本应被释放的物体只是闲逛而无人清理它们的情况。 即使您认为它们应该消失,过度保留的对象也会被有效保留 - 因此泄漏工具无法指出它们,因为它们仍然被引用并且没有办法将它们与应该仍然保留的对象区分开来。

要找到这些,请使用内存报告工具并确保在释放对象后内存使用完全减少。 如果您发现某些内容没有释放内存,您可以首先在 dealloc 中放置断点,以查看您期望看到的释放内容是否真的被释放了。

您需要查找这两种情况以保持干净的内存占用。

Run -> Start with Performance Tool -> Leaks

查找内存泄漏的最佳方法之一是选择“产品”->“分析”。 在左侧的 Xcode 中显示了您在哪个文件中存在内存泄漏。 导致内存泄漏的变量是什么。 这是查找内存泄漏的最佳方法之一。

要检测内存泄漏,您可以使用 Xcode 的“构建和分析”功能。

只需在 Xcode 菜单中选择Build -> Build and Analyze

对主要的内存泄漏工具做了一个总结: http : //bcaccinolo.wordpress.com/2010/09/15/iphone-essential-performance-tools-list/

内存调试器(控制台上方的按钮,在视图调试器旁边)也非常有用。 它将向您显示泄漏,并且您可以轻松检查 /filter 是否对象在不应该在内存中的情况下仍在内存中。

可以在 Xcode 中找到的 Leaks 应用程序: run -> Start with Performance Tool -> Leaks

可以在/Developer/Applications/Performance Tools找到 Apple 的 Instruments 实用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM