【问题标题】:does an entry in Instruments "leaked block" during application running imply memory leak?在应用程序运行期间仪器中的条目“泄漏块”是否意味着内存泄漏?
【发布时间】:2011-09-07 11:58:35
【问题描述】:

应用程序运行期间 Instruments 中的条目“泄漏块”是否意味着内存泄漏?

也就是说,如果一个人在使用 iPhone 应用程序的过程中,您可能有一些变量已被保留,但它还没有到达应用程序中被释放的部分,那么这些显示为是否泄露了块?

如果答案是尚未完成的变量确实在此处显示为泄漏的块,那么如果您正在停止/暂停工具,那么这将非常令人困惑,在这种情况下,如何以一种方式运行工具您看到的任何泄漏块都是有效的内存泄漏? (例如,需要先杀死应用程序以结束一切,然后再查看仪器?)

【问题讨论】:

    标签: iphone xcode memory-leaks xcode4 instruments


    【解决方案1】:

    您应该将泄漏测试拆分为逻辑单元,无论是基于视图还是基于功能。从头开始,彻底测试您的初始视图,修复问题,移动到下一个视图等等。我建议在测试泄漏之前运行静态分析仪。

    【讨论】:

    • 谢谢 - 就我的具体问题而言,我今天所做的最近测试似乎暗示在分析器运行期间的任何时间,如果泄露的块表中有条目这意味着真正的泄漏,但我不能 100% 确定这一点 - 这是我希望确认的......
    • @Greg 假设您正在进行密集计算,在使用仪器进行分析时需要 5 分钟才能完成。如果在 30 秒标记仪器指示内存泄漏 - 就是这样,您可能正在泄漏一个对象。这意味着您没有正确管理对象,并且在 30 秒标记处,没有一个对象不再引用泄漏对象,或者更确切地说:知道泄漏对象的最后一个对象以某种方式丢失了它的内存地址/位置,没有人可以找到它了。也许最后一个对象正确释放了泄漏的对象,但另一个对象忘记了。
    • @Greg 如果您在 2.5 分钟标记处停止仪器,则在该时间之前分配和释放的对象将不再存在。如果在此期间单个对象驻留在内存中,并且没有其他对象知道它,那就是泄漏。当然,你总是可以做类似 alloc+init 对象的操作,将它的内存地址保存到文件(@"%p", object)中,然后在 15 分钟后检索它。仪器可能会告诉您该对象正在泄漏,因为您隐藏了仪器的引用。不知道你为什么会首先做这样的事情......不过你可以尝试,看看 Instruments 的反应:)
    • @Greg 无论如何,我希望我解释了一两件事,但仔细阅读@Rob Napier 的答案,从中可以学到很多东西,这也是正确的答案。我会说你的问题是错误的:)
    【解决方案2】:

    Instruments 中的泄漏表明 Instruments 找不到从一组“根”指针中的任何一个开始的指向已分配内存的指针。具体来说,来自Memory Usage Performance Guidelines

    Leaks 工具会记录您的应用程序中发生的所有分配事件,然后定期搜索应用程序的可写内存、寄存器和堆栈以查找对任何活动内存块的引用。如果它在其中一个地方没有找到对块的引用,则认为该块是“泄漏”,并在“详细信息”窗格中显示相关信息。

    因此,只要您在 ivars、局部变量或静态变量之一中有指向它的指针,保留某些东西就不是泄漏。但是 Leaks 工具在某些方面可能会混淆,有时 Apple 在其框架中存在泄漏,有时 Instruments 存在错误。

    您正在寻找的泄漏内存量会随着时间的推移或在执行特定操作时稳定且显着增加。微小的一次性泄漏通常不值得关注。

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 2012-07-06
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 2011-02-15
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多