【问题标题】:Is there a way in Xcode 4 to find objects which have not been dealloced?Xcode 4 中有没有办法找到尚未释放的对象?
【发布时间】:2011-06-24 11:59:06
【问题描述】:

在我的应用程序中,我的视图中漂浮着随机对象,我认为我通过 [NSMutableArray replaceObjectAtIndex:index withObject:newObject] 删除了这些对象 但事实证明,在我设置 alpha = 0.5 之后,那些被替换的旧对象仍然存在。由于我使用的是带有 ARC 的新 xcode 4,因此我无法检查这些对象是否未能解除分配或其他问题。 那么,xcode 4(是新的)中是否有任何技术或命令可以帮助进行此类调试?

另外,在 xcode 4 中,从视图中删除一个对象会删除它吗?我使用 [object.view removeFromSuperView] 将它们移出视图,但我不知道它们是否仍然存在于其他地方,导致内存泄漏。

【问题讨论】:

  • 如果它们仍然可见,则它们没有被正确地从它们的超级视图中移除。
  • 我还没有开始使用 ARC,但是在 ARC 之前的时代,内置的 clang“分析”功能会报告这样的事情。
  • Mike:当我将它们从超级视图中移除时,它们就会消失。但问题是:仅仅因为你看不到它,这是否意味着它被释放了? Dan:我该如何进行(查找和)使用“分析”?
  • 另外,我的印象是 NSMutableArray ReplaceObject 释放了被替换的对象。有没有人知道它是否是一个事实?
  • 从 NSMutableArray 中移除一个对象,不管你怎么做,释放那个对象。是不是dealloc的它,完全取决于是否有其他的引用。如果您不清楚 release 和 dealloc/"delete" 之间的区别,我建议您阅读(或重新阅读)Apple 的内存管理文档。

标签: objective-c xcode xcode4 nsmutablearray


【解决方案1】:

在该领域获得帮助的最佳方式是使用 Instruments(特别是分配工具)来“调试”哪些对象仍然存在,以及它们的调用堆栈是什么。它需要一些摆弄,但它是一组强大的工具。

【讨论】:

    【解决方案2】:

    我同意使用 Instruments(/Developer/Applications/Instruments) 是可行的方法,但您也可以在代码中设置断点。请参阅“Xcode 4 Transition Guide”中的“调试和分析您的代码”部分,我还建议使用视图的属性子视图遍历超级视图的子视图,如下所示。

        for ( UIView *view in self.view.subviews) {
            // Check your objects here.
    }
    

    关于内存管理,如果你使用 new、alloc、mutablecopy 或 copy 你拥有它并且需要处理对象的内存分配和释放。您可以使用 auto release 或在您的 dealloc 方法中释放它。 uiview 方法 removeFromSuperView 将释放您的对象。

    希望对你有帮助,脆弱的猫

    【讨论】:

    • 那么如果我在 Xcode 4 中 [Class alloc] init],我必须自己处理它吗?
    • 忘记添加您还可以检查并查看有多少对相关对象的引用。 Objective c 使用引用计数策略,因此有可能另一个对象引用了您尝试释放的对象。
    • 是的,您必须,您拥有该对象并且必须管理它的内存分配。
    • 您也可以使用 [[[class alloc] autorelease] 系统会“尝试”管理对象的分配和释放。
    • 对不起,应该是 [[[class alloc] init] autorelease]。
    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多