【问题标题】:NSMutableArray remove object increases reference count?NSMutableArray 删除对象增加引用计数?
【发布时间】:2010-11-07 14:54:23
【问题描述】:

我有一些导致 iOS 静态库内存泄漏的代码。下面是 Instruments 中对象的生命周期:

# Category Event Type Timestamp RefCt Address Size Responsible    Library Responsible Caller
0 Table_ColumnListener Malloc 4712087040 1 0x5e5fe60 16 Tests -[Table _initWithRows:andColumns:andTupleType:]
1 Table_ColumnListener Retain 4712301056 2 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
2 Table_ColumnListener Retain 4712453120 3 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
3 Table_ColumnListener Retain 4712602112 4 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
4 Table_ColumnListener Retain 4712755968 5 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
5 Table_ColumnListener Retain 4712915968 6 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
6 Table_ColumnListener Retain 4713062144 7 0x5e5fe60 0 Tests -[AbstractColumn addColumnListener:]
7 Table_ColumnListener Retain 4729644288 8 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
      /\
 This is what confuses me
8 Table_ColumnListener Release 4729646080 7 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
9 Table_ColumnListener Release 4729647872 6 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
10 Table_ColumnListener Retain 4729679104 7 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
11 Table_ColumnListener Release 4729680896 6 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
12 Table_ColumnListener Release 4729682944 5 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
13 Table_ColumnListener Retain 4729713152 6 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
14 Table_ColumnListener Release 4729714944 5 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
15 Table_ColumnListener Release 4729717248 4 0x5e5fe60 0 Tests -[AbstractColumn removeColumnListener:]
16 Table_ColumnListener Release 4729731840 3 0x5e5fe60 0 Tests -[Table dealloc]

这是[AbstractColumn addColumnListener:]的代码

-(void) addColumnListener:(id <ColumnListener>)listener
{
 [m_listeners addObject:listener];
}

对于[AbstractColumn removeColumnListener:]

-(void) removeColumnListener:(id <ColumnListener>)listener
{
 [m_listeners removeObject:listener];
}

当我从NSMutableArray 中删除对象时,它似乎增加 保留计数而不是减少 它。有没有其他人遇到过这个问题并知道解决方案?

【问题讨论】:

  • 这确实很奇怪,但是如果你注意到,只有三分之一或 4 次调用 removeColumnListener: 实际上 do retain 对象,否则它会将其释放为普通的。只是说 - 不过问题很好。

标签: objective-c nsmutablearray retaincount


【解决方案1】:

我可以重现您使用 Instruments 观察到的内容。在丢弃你的对象之前,NSMutableArray 会保留它,做一些魔法然后释放它。这个释放抵消了之前的保留,并且与稍后发生的事情无关:再次释放,这次是因为对象已从数组中删除。

数组的内部实现是做什么的,你根本不需要关心。它可以随心所欲地保留/释放对象,重要的部分是它调用释放而不是保留,因为您希望在对象被删除时调用。因此,你所观察到的

retain
release
release

很好,根本没有内存泄漏。在 removeObject: 的内部实现中执行代码时,retainCount 可能会上升,但当方法返回时,count 实际上会减少。

【讨论】:

  • 好的,是的,我看过了,正要在这里发帖,是的,就是这样……谢谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多