NSMutableArray删除对象增加引用计数?

时间:2010-11-07 14:54:24

标签: objective-c nsmutablearray retaincount

我有一些代码导致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中移除对象时,似乎增加保留计数而不是递减。有没有其他人有这个问题并知道解决方案?

1 个答案:

答案 0 :(得分:2)

我可以重现你用仪器观察的东西。在丢弃对象之前,NSMutableArray会保留它,做一些魔法然后释放它。此版本抵消了之前的保留,与稍后发生的事情无关:再次发布,这次是因为该对象已从数组中删除。

阵列的内部实现正在做什么,根本不应该关注你。它可以根据需要随时保留/释放对象,重要的是它只调用release而不是retain,因为你期望在删除对象时。因此,你观察到了什么

retain
release
release

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