0

Я загружаю файлы в plist, как показано ниже в ViewVillAppear. При первой загрузке у меня нет утечки, но при нажатии других кнопок/элементов tabBar и возврата к этому виду я получаю утечку. Я выпустил этот NSMutableArray в dealloc, однако он все еще протекает. Немного смущенно почему. (The theProducts3 является NSMutableArray только как Ивар в .h и его не @property или нераспределенный)initWithContentsOfFile Plist in viewWillAppear утечка памяти

- (void)viewWillAppear:(BOOL)animated { 
[super viewWillAppear:animated]; 

NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *plistPath = [rootPath stringByAppendingPathComponent:@"basket.plist"]; 
theProducts3 = [[NSMutableArray alloc] initWithContentsOfFile:plistPath]; 

NSLog(@"Number of objects in item array %i", [theProducts3 count]); 
} 

отпускания массива NSMutable здесь.

-(void)dealloc{ 
[theProducts3 release]; 
[super dealloc]; 
} 

Все указания наиболее оценены! Спасибо ...

+0

Добавить автореферат на него. – CodaFi

+0

Нет, не авторезистируйте его, что приведет к прерывистым сбоям. Поскольку ничто иное не удерживает массив, оно будет освобождено, и вы останетесь с висящим указателем. – Jim

ответ

1

dealloc не является обратным viewWillAppear:. Это инверсия alloc. Обратным значением viewWillAppear: является viewWillDisappear:.

Что происходит, когда появляется ваше представление, вы выделяете память, затем вы переходите к другому контроллеру представления, возвращаетесь назад, ваш вид снова появляется, и вы выделяете еще больше памяти, тем самым утечка оригинальная память.

Если ваш массив нужно только повесить, пока ваши представления находятся в памяти, затем выделите его в viewDidLoad: и отпустите его в viewDidUnload: и dealloc. Не забудьте установить переменную экземпляра в nil после ее освобождения.

+0

спасибо, что это было. У меня было немного недоразумений в отношении руководства некоторыми мужчинами. Но я учусь. Я просто предположил, что для каждого выделения вы должны освободить объект, но этот объект сохраняется в представлении, как вы упомянули выше, это правильно? Можете ли вы также кратко описать мне, почему вам нужно установить объекты на нуль после того, как вы их выпустили? Я использовал, чтобы исправить еще одну утечку, которую я имел раньше в тот же день, но на самом деле не понял, почему установка nil фиксировала мою предыдущую проблему. Еще раз спасибо! –

+0

Лучше всего читать [документацию] (https://developer.apple.com/library/ios/#documentation/cocoa/conceptual/memorymgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994- SW1), но вкратце: когда вы вызываете метод, включающий 'new',' alloc', 'keep' или' copy', у вас есть право собственности на этот объект, и вы несете ответственность за его выпуск. Вы вызываете 'alloc', поэтому ваша ответственность - освободить его. – Jim

+0

Если вы отпустите объект, вы также должны установить для него любые указатели на 'nil', потому что в противном случае у вас есть указатель на память, который может быть перезаписан в любое время - если вы разыгрываете этот указатель, это может сильно свернуть ваше приложение. Поэтому, чтобы вы не делали этого, когда вы отпускаете объект, установите указатели, которые у вас есть, на «nil». – Jim

Смежные вопросы