NSMutableArray удалить объект увеличивает количество ссылок?


У меня есть код, который вызывает утечку памяти в статической библиотеке 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

1 ответ:

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

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

retain
release
release

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