Как вызовы по-разному сохраняются для одного и того же объекта? - PullRequest
0 голосов
/ 14 января 2012

Я хочу знать разницу между следующими двумя:

NSMutableArray *myArray = [[someObject returnMutableArray] retain];

и

NSMutableArray *myArray = [someObject returnMutableArray];
[myArray retain];

У меня есть какой-то сложный проект потока данных, в котором я должен возвращать разные NSMutableArrays. Я также хочу знать, каков наилучший способ вернуть NSMutableArrays.

Ответы [ 2 ]

2 голосов
/ 14 января 2012

Нет никакой разницы, кроме того, как вы хотите отформатировать код.

Причина, по которой это работает, находится в документации для NSObject

Для удобства retain возвращает self, поскольку оно может использоваться во вложенных выражениях.

Следовательно, retain возвращает вызываемый объект (изменяемый массив в вашем случае), что означает, что вы можете вкладывать методы или просто использовать возвращаемое значение в присваивании, как в вашем примере.


Для возврата значений из методов вы должны убедиться, что это autorelease 'd

Итак, используя ваш фрагмент

- (NSMutableArray *)myMethod;
{
    NSMutableArray *myArray = [someObject returnMutableArray];

    // ... do some work

    return myArray;
}

Поскольку метод returnMutableArray не содержит ключевое слово alloc, new или copy, его необходимо сделать так, чтобы он возвращал объект autorelease 'd. Теперь, когда мы возвращаем объект в конце метода, нам не нужно предпринимать дальнейшие сохранения, поскольку он будет готов к возврату.

Если вы не уверены в управлении памятью, вам следует прочитать Расширенное руководство по управлению памятью или (желательно) начать использовать ARC

1 голос
/ 14 января 2012

Нет разницы между 1 и 2.

Лучшая практика для iOS - возвращать автоматически выпущенные объекты из методов, и вам не нужно их сохранять.

Если выне понимая, как работает сохранение и освобождение, вам, вероятно, следует просто включить ARC в своем проекте, который автоматически управляет хранением и выпуском.

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