Утечка памяти 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...] автоматически возвращают автоматически выпущенный объект.