NSMutableArray удалить объект увеличивает количество ссылок? - PullRequest
2 голосов
/ 07 ноября 2010

У меня есть код, который вызывает утечки памяти в статической библиотеке iOS. Вот время жизни объекта от инструментов:

# 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 Ответ

2 голосов
/ 08 ноября 2010

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

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

retain
release
release

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

...