Правильно ли говорить, что методы, имена которых содержат new, alloc, create или copy, не выпускают автоматически объекты, которые они создают? - PullRequest
2 голосов
/ 01 мая 2009

Насколько я знаю, только "удобные" методы возвращают созданные объекты с -autorelease, так что получатель не отвечает за память этого объекта. Но поскольку Apple говорит, что когда вы используете метод с именем, состоящим из «new», «alloc», «create» или «copy», вы отвечаете за освобождение объекта, возвращаемого методом, я думаю, что эти методы должны не -авторизовать эти объекты. В противном случае они будут «удобными», и получатель не будет нести ответственность вообще, пока он не удержит полученный объект. Я правильно понял?

Ответы [ 5 ]

5 голосов
/ 02 мая 2009

Практическое правило заключается в том, что вы владеете (и, следовательно, должны освобождать) любым объектом, который вы

  • alloc (используя метод, начинающийся с «alloc» или «new» *)
  • копия (используя любой метод, содержащий слово copy)
  • сохраните явно себя

* new объединяет alloc и init в один метод.

Удобные методы возвращают объекты, которые были автоматически освобождены. Они действительны для области действия метода, в котором вы их получаете, и могут быть переданы обратно вызывающему методу (как правило). Если вы хотите хранить их дольше, вам нужно сохранить их.

5 голосов
/ 01 мая 2009

Ответ на вопрос в названии - да, однако:

только методы "удобства" возвращают созданные объекты с -autorelease

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

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

Все это очень четко изложено в онлайн-документации Apple по управлению памятью в Какао ; Вы действительно должны внимательно прочитать эти документы. Там есть ответы на многие вопросы, которые вы задаете на этом сайте, и это окончательный источник.

1 голос
/ 01 мая 2009

Почти.

Я не верю, что слово "создать" является одним из определенных ключевых слов из руководящих принципов Apple

В противном случае ваша логика верна. Объект, который возвращает метод, не сохраняется классом этого метода.

NSObject *obj = [[someClass alloc]init]; // you are responsible
NSObject *obj = [someClass someConvenientMethod]; // the object is auto-released, you do not own this object
1 голос
/ 01 мая 2009

Это правильно. Официальное слово на Сайт разработчика Apple Это для CoreFoundation, но это относится и к Какао.

0 голосов
/ 04 мая 2009

Ознакомьтесь с документацией Apple по Владение и распоряжение объектами

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