Правильно ли говорить, что методы, имена которых содержат new, alloc, create или copy, не производят автоматического выпуска объектов, которые они создают?
-
03-07-2019 - |
Вопрос
Насколько я знаю, только "удобные" методы возвращают созданные объекты с -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 по Право собственности и распоряжение объектом