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

StackOverflow https://stackoverflow.com/questions/811547

Вопрос

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

  

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

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

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

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

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

Почти.

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

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

NSObject *obj = [[someClass alloc]init]; // you are responsible
NSObject *obj = [someClass someConvenientMethod]; // the object is auto-released, you do not own this object

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top