Подтвердить что ты не робот

Как узнать, нужно ли мне сохранить или назначить свойство?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Для обсуждения вокруг использования копии и сохранения см. этот вопрос SO.

Ответ 3

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

Ответ 4

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