Как мне узнать, нужно ли мне сохранить или присвоить недвижимость? - PullRequest
33 голосов
/ 24 апреля 2009

Есть ли хорошие правила, чтобы узнать, когда я должен использовать retain и когда назначить?

Ответы [ 4 ]

53 голосов
/ 25 апреля 2009

Назначение для примитивных значений, таких как BOOL, NSInteger или double. Для объектов используйте retain или copy, в зависимости от того, хотите ли вы сохранить ссылку на исходный объект или сделать его копию.

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

4 голосов
/ 15 мая 2011

Я знаю, что это был старый вопрос, но я нашел эти рекомендации от uber гуру Мэтта Галлахера, очень полезные: http://cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html. В моем случае у меня был «удерживающий ад» мой собственный способ иметь hard ссылку на родительский объект.

4 голосов
/ 24 апреля 2009

Я бы подумал, что при работе с объектами вы почти всегда будете использовать retain вместо assign, а при работе с примитивными типами, структурами и т. Д. Вы будете использовать assign (поскольку вы не можете сохранять не-объекты). Это потому, что вы хотите, чтобы объект со свойством решал, когда это будет сделано с объектом, а не что-то еще. В руководстве по управлению памятью Apple говорится следующее:

Бывают моменты, когда вы не хотите полученный объект подлежит утилизации; за Например, вам может понадобиться кэшировать объект в переменной экземпляра. В этот случай, только вы знаете, когда объект больше не нужен, поэтому вы нужна сила, чтобы гарантировать, что объект не утилизируется, пока вы все еще используем это. Вы делаете это с сохранить сообщение, которое сохраняет эффект ожидающего авто-релиза (или выгрузки более поздний выпуск или авто-релиз сообщение). Сохраняя объект, вы убедитесь, что он не будет освобожден пока вы не закончили с этим.

Для обсуждения использования copy vs retain см. этот вопрос SO .

0 голосов
/ 24 апреля 2009

Если вы намереваетесь сохранить объект и использовать его, используйте retain. В противном случае он может быть освобожден, и вы получите ошибки с вашим кодом.

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