Утечка памяти iPhone при инициализации NSMutableDictionary - PullRequest
0 голосов
/ 21 апреля 2011

Я получаю утечку памяти для каждого объекта, который добавлен в 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 Ответ

2 голосов
/ 21 апреля 2011

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];

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

...