2010-07-19 15 views
3

我正在接近完成我的应用程序的发布,并试图使用仪器来修复任何内存泄漏。为什么我在设备上使用仪器而不是在模拟器上存在内存泄漏

为什么在使用仪器和我的设备时可以发现一处内存泄漏,而当我使用iPhone模拟器时却不能?我知道这是一个高层次的问题,但我不认为发布任何代码会帮助反正(相当多的代码...)。

是否有可能让仪器指向它认为泄漏的源代码?我可以在使用模拟器时做到这一点,但是在将它用于设备时它似乎不起作用(对象由地址表示(我假设)在为模拟器运行时会看到它是什么对象,设置问题?)

在此先感谢!

问候, 尼克拉斯

更新:莫非有事情做与OSX是有自动垃圾收集,但iOS不?

回答

7

仅信任设备。这就是您的用户将用来运行您的应用程序。
不要相信模拟器。
作为一个演示,我只是故意将泄漏添加到项目中。在模拟器中未检测到泄漏,但在设备上按预期显示。
模拟器就是这样:模拟器。加速工作可能会很有用,但绝不会取代设备。

Once Instruments向您显示泄漏的物体,您可以双击它。它会显示你的代码负责泄漏的部分。这适用于模拟器和设备。
当您为设备编译时,确保您处于调试模式(并且此模式的设置保留了所有符号)。



一些更多的提示,可能对您有用:

对于一个更流畅的会话,禁用“自动泄漏检查”,并且适当的时候手动按下“检查是否有泄漏现在”按钮。

“构建和分析”命令将帮助您找到泄漏问题,做出出色的工作。它不是(完全)神奇的,所以它不会发现所有的泄漏。例如,泄露的iVars不会被识别。但是对于一个方法的范围来说,这真是太棒了。
我强烈建议在您的编译设置中激活“运行静态分析器”标志(或者如果您的编译器速度较慢,则仅用于“发布”模式)。

如果您想了解如何使用工具来发现泄漏,请阅读本文档苹果更多信息:Instruments User Guide: Built-in InstrumentsInstruments User Guide: Viewing and Analysing Trace Data > Looking for Memory Leaks
您还可以观看WWDC相关会议的视频。
如果你仍然不知道你的泄漏来自哪里,那么是时候重新阅读Memory Management Programming Guide

谢谢你想要发送一个无泄漏的应用程序。使用iOS 4,现在比以往任何时候都更加重要。

+0

感谢您的回答!我已经使用了Build and Analyze,它帮助我找到了一些泄漏。但是,经常“太”也会解决某些问题和其他一些问题。我只是清理代码(主要是NSLogs和注释),然后内存泄漏消失了......并不是所有人都试图修复内存泄漏......? (你不必回答这个问题......)) – Nicsoft 2010-07-21 07:04:06

0

如果您还没有看看构建菜单中方便的“构建和分析”选项。它将运行通常做得很好的静态分析器。如果什么都没有出现,你应该有时间回顾一下Instruments上的WWDC会话视频。

在硬件上进行性能分析是无可替代的,并且在调试器和仪器连接的情况下,您可以获得模拟器上下文中的所有内容。

+0

谢谢你的回答。我已经完成了构建和分析,它帮助了我一些,但也标记了一些“不必要的”活动(例如,当在if子句中定义实际变量的if子句中分配新对象变量时,然后返回“返回[变量autorelease]“,它肯定会在之前分配)。 – Nicsoft 2010-07-21 07:08:44

相关问题