Почему элемент NSMutableArray не освобождается? - PullRequest
1 голос
/ 26 февраля 2012

Почему элемент NSMutableArray не освобождается, когда он добавляется следующим образом:

[map addObject:[[FLItem alloc] init]];

[map release];

и работает, когда:

FLItem *item = [[FLItem alloc] init];
[map addObject:item];
[item release]; 

[map release];   

В чем здесь разница?

PS В реализации FLItem для разметки есть NSLog.

1 Ответ

4 голосов
/ 26 февраля 2012

Когда вы добавляете элемент, как это:

[map addObject:[[FLItem alloc] init]];

или как это:

FLItem *item = [[FLItem alloc] init];
[map addObject:item];

его счетчик хранения равен 2, потому что вы создали его с помощью init (это 1), а NSMutableArray также сохраняет его (это еще 1).

Таким образом, когда вы освобождаете массив, он освобождает элемент, и его счетчик сохранения становится равным 1. Так что в первом случае он не освобождается, а во втором случае, когда вы вызываете [item release];, он освобождается.

Что вам, вероятно, следует сделать в первом случае:

[map addObject:[[[FLItem alloc] init] autorelease]];
...