Рекомендации по утечке памяти iOS

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

Для получения дополнительной информации об управлении памятью ознакомьтесь здесь:

Руководство по программированию расширенного управления памятью