#ios #memory-management #memory-leaks #nsmutablearray
#iOS #управление памятью #утечки памяти #nsmutablearray
Вопрос:
Я почти уверен, что это вызывает утечку, и я хотел бы получить несколько советов. Вот код, основанный на том, что я делаю:
NSMutableArray* straVideoTitles;
- (void) parseData{
//stuff
straVideoTitles = [self getVideoTitle:strData]; //strData contains unparsed data
//more stuff
}
- (NSMutableArray*) getVideoTitles:(NSString*)strData{
NSMutableArray *array;
array = [[NSMutableArray alloc] init];
//Parse data and populate array
return array;
}
Основываясь на том факте, что я выделяю пространство для NSMutableArray и не освобождаю его, это утечка, верно? Как мне решить эту проблему? Должен ли я отказаться от возврата значения и назначить straVideoTitles внутри getVideoTitles, а затем выпустить, как:
- (void) getVideoTitles:(NSString*)strData{
NSMutableArray *array;
array = [[NSMutableArray alloc] init];
//Parse data and populate array
straVideoTitles = array;
[array release];
}
или я все делаю неправильно? Или все в порядке, потому что я выпускаю straVideoTitles в dalloc?
Ответ №1:
Вы могли бы изменить
return array;
в
return [array autorelease];
Или вы могли бы использовать ARC и просто больше не заботиться об этом.
Редактировать: второй подход возможен и не включает утечку памяти, но код менее капсулирован и, следовательно, менее пригоден для повторного использования и докажет это в будущем.
Ответ №2:
Измените на
return [array autorelease];
Ответ №3:
Рекомендуется возвращать объекты автоматического освобождения из методов. Это называется сообщением об отложенном выпуске.
Вы отказываетесь от права собственности, позволяя вызывающему методу использовать возвращаемый массив до его освобождения.
Ваше заявление о возврате должно гласить:
return [array autorelease];
Для получения дополнительной информации об управлении памятью ознакомьтесь здесь:
Руководство по программированию расширенного управления памятью