如何在iPhone上检测内存泄漏?

24

我正在使用Xcode的泄漏检测工具来(尝试)查找内存泄漏。我仍然没有弄清如何使用这个程序。我点击程序中的Leaks并在模拟器中做各种事情时观察到内存增加。我已经显示了Extended Detail面板。Extended Detail面板中唯一与我的应用相关的是main方法,这是由Xcode生成的主方法。其他所有内容都是UIKit、Foundation和其他SDK类,我没有编写它们。为什么我的应用程序没有显示出来?

在不到3分钟的时间内,就有100多个泄漏总共2.5k。这种情况常见吗?


1
你是在查看实际的“泄漏”数据还是在查看对象分配数据?如果你是在查看后者,那么是正常的...那些不是泄漏,只是分配。它可以让你了解内存占用情况。 - Jason Coco
我正在查看内存泄漏。唯一有问题的是我的主函数。随着我使用应用程序,泄漏数量和字节数继续增加。我不明白为什么主函数会泄漏这么多。 - 4thSpace
确保所有的内存分配都被释放。如果没有释放,就会造成内存泄漏。 - Niels Hansen
13个回答

29

不错的教程。只需使用Xcode通过帮助并键入“泄漏”即可加载仪器,您就可以跳过很多步骤。它会显示菜单选项,以便一切设置好了。 - cregox
这个链接已经失效了,能否请您更新一下。 - Noitidart

5
在仪表板上将视图更改为“扩展细节”。这将在您停止录制并选择泄漏对象后显示每个泄漏对象的堆栈跟踪。
您可以看到对API的调用,但您感兴趣的是找到应用程序在调用API之前的最后一个方法,那就是泄漏的位置。
提示:在泄漏视图中打开“收集内存内容”。查看对象值也有助于找到问题所在。
您不希望有任何泄漏。100个泄漏不是典型情况(至少在我的应用程序中;)典型情况应该是0。

@Ben 谢谢。我会试一下。@lajos 请看我说“我已经显示了扩展详细信息窗格”的部分。 - 4thSpace

3

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


3

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


我下载了那个工具,只是发现在它的文档中似乎与已包含在XCode中的工具相同(使用“command-shift-a”执行)。这是真的吗? - Jonny
真的。一年半前我发布这个时,它还没有包含在Xcode中。 - Sophie Alpert

2
请记住,模拟器可能会泄漏,而设备不会。我曾经在UITableViewController类中遇到过这个问题。

2
使用LLVM/Clang静态分析器。

1
Run -> Start with Performance Tool -> Leaks

1
请注意,泄漏工具不会显示对象被过度保留并仍然持有的情况。泄漏是指本应该被释放但仍然挂在那里没有人来清理它们的对象。过度保留的对象虽然你认为它们应该已经消失了,但它们确实被有效地保留着 - 因此泄漏工具无法指出它们,因为它们仍然被引用,并且无法将它们与仍应该被保留的对象区分开来。
要找到这些对象,请使用内存报告工具,并确保在释放对象后内存使用完全下降。如果您注意到某些东西没有释放内存,可以从在dealloc中设置断点开始,以查看您期望释放的内容是否真正被释放。
您需要查找这两种情况,以保持干净的内存占用。

太好了!为了找到它们,有时我会在dealloc中添加NSLog调用来打印保留计数。 - lajos

0

在Xcode中可以找到泄漏应用程序:运行 -> 使用性能工具开始 -> 泄漏

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



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接