2010-11-07 2 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:' фактически ** делает ** 'сохранение' объекта, в противном случае он отпускает его как обычно. Просто скажи - Хороший вопрос. –

ответ

2

Я могу воспроизвести то, что вы наблюдаете с помощью инструментов. Прежде чем отбрасывать свой объект, NSMutableArray сохраняет его, делает магию и затем освобождает его. Этот выпуск противодействует предыдущему сохранению и не имеет ничего общего с тем, что происходит немного позже: снова релиз, на этот раз, потому что объект удален из массива.

То, что делает внутренняя реализация массива, не должно касаться вас вообще. Он может сохранять/освобождать объект так часто, как он хочет, важная часть состоит в том, что он вызывает освобождение еще раз, чем сохранение, потому что вы ожидаете, что когда объект будет удален. Таким образом, то, что вы наблюдаете

retain 
release 
release 

просто отлично и никакой утечки памяти вообще. При выполнении кода во внутренней реализации removeObject :, saveCount может увеличиться, но как только метод вернется, счет фактически уменьшится.

+0

Хорошо, да, я посмотрел на это и собирался публиковать здесь, и да, вот что происходит ... спасибо за вашу помощь! –

Смежные вопросы