【问题标题】:Is it necessary to call removeAllObjects on NSArray when deallocating under ARC?在 ARC 下释放时是否需要在 NSArray 上调用 removeAllObjects?
【发布时间】:2012-10-10 02:12:54
【问题描述】:

我目前正在调试一个在 Instrument 中使用 ARC 的应用程序。似乎如果Object A 包含一个包含Object Bs 的数组,我需要在实例变量contents 上显式调用removeAllObjects 方法,这是一个NSArray

- (void)dealloc {
    NSLog(@"%@ deallocing", self);
   [_contents removeAllObjects];
}

如果我要注释掉[_contents removeAllObjects] 行,仪器显示包含在数组中的对象在父对象被释放后仍然存在。我认为当NSArray 解除分配时,它会自动减少其中包含的元素的保留计数。那么为什么需要显式删除呢?这种行为是调试本身的副作用吗?

【问题讨论】:

  • 嗯。即使在A 的实例被dealloced 之后,该数组似乎更有可能仍然存在。您确定吗,A 的实例持有的引用是您的应用程序中对数组的唯一引用。那个时候?
  • 其实我想我想通了。无论出于何种原因,我都需要在对象释放之前将应用程序的焦点切换到前台(打印 NSLog 消息)。以前的焦点总是在 XCode 和控制台上。看起来像从数组中显式删除内容改变了释放的时间。

标签: objective-c memory-leaks automatic-ref-counting instruments


【解决方案1】:

通常:

  • 如果一个对象被释放,它的所有 ivars 都被释放。
  • 如果数组被释放,数组中的所有对象的保留计数都会减少。

如果我不得不猜测,您正在某处的某个块中使用数组中的对象。对于 ARC,块是内存泄漏的主要来源。

您在哪里或如何使用数组和数组中的对象?

【讨论】:

    猜你喜欢
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多