Управление памятью Objective-C - лучшие практики при возврате объектов? - PullRequest
12 голосов
/ 28 марта 2009

Предположим, у меня есть такая функция:

- (NSSet *) someFunction {
    //code...
    return [[[NSSet alloc] initWithObjets:obj1, obj2, nil] autorelease];
}

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

Однако, что если я не делаю авто-релиз, то теперь некоторая функция выглядит следующим образом:

- (NSSet *) someFunction {
    //code...
    return [[NSSet alloc] initWithObjets:obj1, obj2, nil];
}

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

Мой вопрос: что является рекомендуемой / наилучшей практикой для подобных ситуаций? Рекомендуется одна или другая версия someFunction? Спасибо.

Ответы [ 3 ]

12 голосов
/ 28 марта 2009

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

Суть в том, что если вы получаете ссылку через метод, начинающийся с 'alloc' или 'new' или содержащий 'copy', вы владеете ссылкой и вам не нужно ее сохранять. Вы должны предусмотреть его выпуск, либо путем прямого выпуска, либо с помощью автоматического выпуска.

Если вы получаете ссылку любым другим способом (через метод класса или что-то еще), у вас нет ссылки, поэтому вам не нужно ее выпускать. Если вы хотите сохранить ссылку, вы должны сохранить ее.

В целом, это действительно довольно просто и эффективно.

2 голосов
/ 28 марта 2009

Единственная причина, по которой вы должны делать код во втором примере, это если имя вашего метода начинается с new, alloc, create, copy или что-то в этом роде.

В противном случае вы несете ответственность за освобождение (или автоматическое освобождение) любого выделенного вами объекта. Первый пример - правильный способ сделать большинство вещей.

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

2 голосов
/ 28 марта 2009

Хмм ...

Обычно я следую этому "пути".

+ (id)MyObj {
  return [[[MyObj alloc] init] autorelease];
}

Выпуская объект до его возвращения, объект будет освобожден до того, как достигнет вызывающего объекта. Это приведет к ошибке. Избегайте этой ошибки, используя вместо этого пул автоматического выпуска. Первоначально представлен мне Скоттом Стивенсоном из Теокакао. Это его и многие, предпочтительный способ для Obj-C 1.0.

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