iOS правильный способ (управление памятью) для метода, возвращающего значение - PullRequest
0 голосов
/ 01 июля 2011

Если у меня есть класс с именем Foo, и у меня есть эта функция + getIds, которая должна возвращать идентификаторы. Будет ли правильная подпись + getIds выглядеть так:

+ (NSArray *)getIds {

    NSMutableArray *ids = [[[NSMutableArray alloc] init] autorelease];

    return ids;
}

Что мне интересно, так это то, что если я должен использовать авто-релиз на *ids? Там нет другого пути, я предполагаю? Я не могу сделать [ids release] после оператора возврата, верно?

Ответы [ 3 ]

3 голосов
/ 01 июля 2011

Вы можете отправить autorelease сообщение вместе с alloc, init сообщениями. Вы также можете сделать, return [ids autorelease]; Примечание: вы не должны делать оба одновременно ; -)

Вы не можете вернуть [id release], потому что сам метод release ничего не возвращает.

1 голос
/ 01 июля 2011

Как правило, правильное управление памятью для возвращаемых объектов состоит в том, чтобы вызываемый метод устанавливал его как объект с автоматическим освобождением, , за исключением , когда имя метода содержит «copy», «new» или «alloc». В этих случаях (copy / new / alloc) возвращаемый объект сохраняется, и вызывающий объект владеет им (т. Е. Вызывающий отвечает за то, чтобы он был освобожден).

Код, который вы написали в вопросе, будет работать правильно - он вернет автоматически выпущенный объект.

Когда вызывающий абонент получает обратно NSArray, он может использовать объект сколько угодно, и если ему не нужен объект в будущих вызовах, ему не нужно выполнять какое-либо дополнительное управление памятью. В конце цикла выполнения будет сброшен NSArray, что является желаемым поведением. Если вызывающему нужно , чтобы объект жил дольше, он должен вызвать на нем retain (или что-то эквивалентное этому, например, вызвать что-то еще, которое вызывает на нем retain), и затем они берут на себя ответственность позвонить в релиз позже.

Полезные вещи:

Кроме того, все это исчезнет, ​​когда ARC (автоматический подсчет ссылок в iOS 5) станет нормой.

0 голосов
/ 01 июля 2011

Вы уже уже автоматически высвобождаете массив, поэтому повторный вызов autorelease будет ошибкой, которая может привести к сбою. Тот факт, что вы не можете выполнить release после возврата (к тому времени вы покинули функцию), является одной из причин существования autorelease.

О том, должен ли метод возвращать автоматически освобожденный объект в противоположность сохраненному объекту: только методы, начинающиеся с alloc или new или содержащие copy (как в mutableCopy), должны возвращать сохраненные объекты. Все остальные методы должны возвращать автоматически освобожденные объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...