Советы по утечке памяти в iOS - PullRequest
0 голосов
/ 14 ноября 2011

Я почти уверен, что это вызывает утечку, и я хотел бы получить несколько советов. Вот код, основанный на том, что я делаю:

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?

Ответы [ 3 ]

3 голосов
/ 14 ноября 2011

Вы можете изменить

return array;

в

return [array autorelease];

Или вы могли бы использовать ARC и просто больше не заботиться о нем.

Редактировать: Второй подход возможен и не включает в себя утечку памяти, но код менее капсулирован и, следовательно, менее пригоден для повторного использования и в будущем.

2 голосов
/ 14 ноября 2011

Хорошей практикой является возврат объектов автоматического освобождения из методов.Это называется отложенным выпуском сообщения.

Вы отказываетесь от владения, позволяя вызывающей стороне метода использовать возвращенный массив до его освобождения.

В вашем операторе возврата должно быть указано:

return [array autorelease];

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

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

2 голосов
/ 14 ноября 2011

Изменить на

return [array autorelease];

...