Утечка памяти iPhone при инициализации NSMutableDictionary

Я получаю утечку памяти для каждого объекта, который добавляется в glossTerms (кроме первого объекта). Утечка описана как имеющая "A +1 retain count (владелец ссылки)" - я искал в Интернете и обнаружил пару потоков, в которых упоминается использование "copy" внутри выделения объектов. Я попробовал это, но я, должно быть, не реализовал это должным образом, поскольку у меня все еще были утечки памяти.

- (void)createTermData {

NSMutableArray *glossTerms=[[NSMutableArray alloc] init];

[glossTerms addObject:[[NSMutableDictionary alloc]
                       initWithObjectsAndKeys:@"Approximate",@"term",
                       @"Test",@"definition",@"Test2",@"example",nil]];

[glossTerms addObject:[[NSMutableDictionary alloc]
                       initWithObjectsAndKeys:@"Arithmetic Mean",@"term",
                       @"Test",@"definition",@"Test2",@"example",nil]];

termData=[[NSMutableArray alloc] initWithObjects:
            glossTerms,nil];

[glossTerms release];

Если кто-нибудь из вас сможет пролить свет на это, я был бы очень благодарен.

Спасибо

1 ответ

Решение

NSArray сохранит любой объект, который вы добавили к нему, и автоматически освободит его, либо в конце его жизненного цикла, либо после удаления из массива (если он изменчив).

Когда вы выделяете объект, его счет удержания равен +1.

Поэтому, когда вы выделяете объект и добавляете его в массив, его счетчик сохранения равен +2. Это означает, что вы должны либо автоматически высвободить объект (что я и сделал бы в вашем случае, поскольку вы размещаете на той же строке, которую вы добавляете), либо освободить его после добавления, если у вас есть ссылка на указатель. В вашем случае, у вас нет ссылки, так что авто-релиз это ваш лучший выбор.

NSMutableArray *glossTerms=[[NSMutableArray alloc] init];

[glossTerms addObject:[[[NSMutableDictionary alloc]
                       initWithObjectsAndKeys:@"Approximate",@"term",
                       @"Test",@"definition",@"Test2",@"example",nil] autorelease]];

[glossTerms addObject:[[[NSMutableDictionary alloc]
                       initWithObjectsAndKeys:@"Arithmetic Mean",@"term",
                       @"Test",@"definition",@"Test2",@"example",nil] autorelease]];

termData=[[NSMutableArray alloc] initWithObjects:
            glossTerms,nil];

[glossTerms release];

Кстати, статические методы [NSMutableDictionary dictionaryWith...] автоматически возвращают автоматически выпущенный объект.

Другие вопросы по тегам