2010-11-07 56 views
2

我有一些代码导致iOS静态库上的内存泄漏。这里是从仪器对象的生命周期:NSMutableArray删除对象增加引用计数?

# 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删除对象的代码,它似乎增加保留数而不是递减吧。有没有其他人有这个问题,并知道一个解决方案?

+0

这确实很奇怪,但如果你注意到,在3或4中只有一个调用'removeColumnListener:'实际**做**'保留'这个对象,否则它会像平常一样释放它。只是在说' - 不过是个好问题。 – 2010-11-07 15:04:39

回答

2

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

该数组的内部实现在做什么不应该关心你。它可以根据需要经常保留/释放对象,重要的部分是它会调用释放一次而不是保留,因为当对象被移除时,您会期望这种释放。因此,你观察到什么

retain 
release 
release 

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

+0

好吧,是的,我看了看,正准备在这里发帖,是的,那是发生了什么...感谢您的帮助! – 2010-11-08 13:16:05