【问题标题】:Adding an object to an NSArray is leaking, but why?向 NSArray 添加对象会泄漏,但为什么呢?
【发布时间】:2011-12-21 13:21:04
【问题描述】:

我有一个类,其中包含一个名为 _contents 的 NSMutableArray。该数组在创建此类的实例时被初始化,并且有一个方法 setContentsObject: 将对象添加到内容中。这是setContentsObject的实现:

- (void)addContentsObject:(id <MyProtocol>)object
{
    [_contents addObject:object];
}

非常简单,而且它有效,但是当我使用 Leaks 工具分析我的应用程序的运行时,我在该方法的一行中得到报告的泄漏(标记为“100%”)。我知道 addObject: 保留了对象,但我以前从未遇到过这个问题,我不知道可以对这个方法做些什么。

【问题讨论】:

  • 也许你的阵列永远不会被释放。或者您添加的对象可能已经保留(而不是自动释放)。
  • 没有看到更多你的代码,我不确定我能帮助你。

标签: ios memory-leaks nsmutablearray instruments


【解决方案1】:

我遇到了 addObject 泄漏的情况,只需用 insertObject:atIndex 替换该行即可修复它。我什至通过多次泄漏测试证明了这一点。

现在,我可以告诉你它泄漏的确切原因和时间吗?不是真的......我可以猜测并说后者更精确。我绝对知道它解决了我的问题,只是将其归类为错误 :)

【讨论】:

    【解决方案2】:

    没有更多代码就无法判断。但是,addObject: 将保留您传递的内容。所以你可以认为数组“拥有”这个对象,你可以在调用你的addContentsObject:方法后释放它。

    正如 Hot Licks 所提到的,如果没有人释放数组,它拥有的所有对象也会挂起。

    您可能想要使用 Leaks 工具执行的操作是查看您的泄漏对象之一,并查看所有引用。

    哦,您可能想考虑改用 ARC。

    【讨论】:

      【解决方案3】:

      我很确定这与 Obj-C 看待方法名称的方式有关。任何以 -copy -add 或 -new 为前缀的内容都会为返回的对象添加保留计数。如果您不打算这样,请尝试重命名该方法一次,看看它是否仍然泄漏。我的猜测是不会。

      【讨论】:

      • 方法的名称不影响它的工作方式。 (分析命令使用的名称 。)
      猜你喜欢
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 2017-05-03
      相关资源
      最近更新 更多