2010-11-07 58 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