Правильный способ вернуть массив - PullRequest
3 голосов
/ 21 марта 2010

Кажется, я никогда не понял это правильно. У меня есть метод, который возвращает изменяемый массив. Как правильно вернуть массив и избежать возможных утечек памяти?

Если я планирую хранить результаты локально внутри другого контроллера представления, влияет ли это на способ возврата массива?

И, наконец, что, если это просто неизменяемый массив? Требуется ли для этого другая техника?

спасибо, Howie

Ответы [ 3 ]

4 голосов
/ 21 марта 2010

Если ваш метод не имеет alloc или copy в имени, то правильной вещью будет возвращение автоматически выпущенной версии массива. Кроме того, вы должны вернуть копию массива, чтобы предотвратить изменение вашей локальной копии

- (NSMutabalArray*] mutableArray {
    return [[myArray mutableCopy] autorelease];
}

- (NSArray*] array {
    return [[myArray copy] autorelease];
}
2 голосов
/ 21 марта 2010

Возврат автоматически выпущенного объекта. Если вы создали свой массив с помощью любых методов alloc / init / copy - вы должны отправить сообщение autorelease в массив перед его возвратом (что-то вроде return [myArray autorelease];). В противном случае массивы, созданные с помощью фабричных методов (arrayFrom... arrayWithContentsOf...), возвращают автоматически освобожденный объект, поэтому вам не нужно беспокоиться об утечках памяти.

Вы должны прочитать об управлении памятью и сохранить счет на сайте Apple Dev. Могут быть и другие методы инициализации, которые сохраняют возвращаемый объект, что может привести к утечке памяти.

1 голос
/ 21 марта 2010

Для NSMutableArray я бы использовал:

-(NSMutableArray*)getMyArray
{
   NSMutableArray *retval = [[NSMutableArray alloc] init];
   // do your stuff w/ array
   return [retval autorelease];
}

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

...