【问题标题】:Why am I having memory leaks using Instruments on the device but not on the simulator为什么我在设备上使用 Instruments 而在模拟器上却没有内存泄漏
【发布时间】:2011-03-17 23:44:24
【问题描述】:

我即将完成我的应用程序的发布,并正在尝试使用 Instruments 来修复任何内存泄漏。

为什么我在使用 Instruments 和我的设备时可以发现一个内存泄漏,但在我使用 iPhone 模拟器时却没有?我知道这是一个高级问题,但我认为发布任何代码无论如何都无济于事(相当多的代码......)。

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

提前致谢!

问候, 尼克拉斯

更新:这可能与 OSX 具有自动垃圾收集但 iOS 没有有关吗?

【问题讨论】:

    标签: objective-c xcode debugging memory-leaks instruments


    【解决方案1】:

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

    一旦 Instruments 向您展示了一个泄露的对象,您可以双击它。它将显示负责泄漏的代码部分。这适用于模拟器和设备。
    为设备编译时,请确保您处于调试模式(并且此模式的设置保留了所有符号)。



    一些您可能会觉得有用的提示:

    要获得更流畅的会话,请禁用“自动泄漏检查”,并在适当时手动按下“立即检查泄漏”按钮。

    “构建和分析”命令将出色地帮助您发现漏洞。它不是(完全)神奇的,所以它不会找到所有的漏洞。例如,泄漏的 iVar 将无法识别。但是对于一个方法的作用域,它简直太棒了。
    我强烈建议在您的构建设置中激活“运行静态分析器”标志(如果您的机器编译速度较慢,则仅用于发布模式)。

    如果您想了解有关如何使用 Instruments 查找泄漏的更多信息,请阅读此 Apple 文档:Instruments User Guide: Built-in InstrumentsInstruments User Guide: Viewing and Analysing Trace Data > Looking for Memory Leaks
    您还可以观看 WWDC 相关会议的视频。
    如果您仍然不明白泄漏的来源,是时候(重新)阅读Memory Management Programming Guide

    感谢您希望发布无泄漏的应用程序。在 iOS 4 中,它现在比以往任何时候都更加重要。

    【讨论】:

    • 感谢您的回答!我已经使用了 Build and Analyze,它帮助我找到了一些漏洞。但是,因为“太”经常,你修复了一些东西,而其他一些问题消失了。我只是在清理代码(主要是 NSLogs 和 cmets)然后内存泄漏就消失了……而且不是所有人都试图修复内存泄漏……? (你不必回答这个问题......;))
    【解决方案2】:

    如果您还没有查看构建菜单中方便的“构建和分析”选项。它将运行通常做得很好的静态分析器。如果没有任何结果,您应该花一些时间查看 Instruments 上的 WWDC 会议视频。

    在硬件上进行分析是无可替代的,通过连接调试器和仪器,您可以获得在模拟器环境中所需的一切。

    【讨论】:

    • 感谢您的回答。我已经完成了构建和分析,它对我有所帮助,但也标记了一些“不必要的”活动(比如在 if 子句中分配一个新的对象变量时,其中实际变量在 if 子句之前定义。然后用“ return [variable autorelease]"。它肯定会在之前分配。)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2011-03-08
    相关资源
    最近更新 更多