Свойства в dealloc: release затем установлены в ноль?или просто отпустить - PullRequest
7 голосов
/ 04 августа 2010

Я новичок в Objective-C (и stackoverflow), и я немного обдумал лучшие практики в отношении свойств.

Насколько я понимаю, когда вы полностью закончили со свойством, вы можете избежать ошибок, выпуская их, а затем сразу устанавливая значение nil, чтобы последующие сообщения также возвращали nil вместо исключения.

[myProperty release], myProperty = nil;

Однако, когда дело доходит до dealloc для свойств 'copy' и 'retain', есть ли необходимость в обоих?или простой

[myProperty release] обрезает его?Кроме того, я прав, что мне не нужно освобождать свойства 'assign' в dealloc?

Спасибо!

Ответы [ 3 ]

17 голосов
/ 04 августа 2010

Делай релиз, но не утруждай себя установкой на ноль. Установка на ноль через ваш @synthesized setter:

self.myProperty = nil

высвободит ваше старое значение как часть переназначения (хотя, как отмечено в комментариях, может иметь нежелательные побочные эффекты), но просто присвоит nil вашей переменной-члену:

myProperty = nil

не будет.

[myProperty release]

- это все, что вам нужно.

(и вы правы насчет "назначить" свойства.)

0 голосов
/ 07 августа 2010

@ Dave DeLong: Когда выполняется метод dealloc объекта, объект больше не используется.Все наблюдатели kvo должны быть удалены к этому моменту, иначе исчезновение исчезнет.И в любом случае - даже если наблюдатель увидит изменение, объект по-прежнему будет существовать (хотя бы частично).

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

0 голосов
/ 04 августа 2010

@ Дейв ДеЛонг и ДжеремиП: Я думаю, что мы могли бы сказать «используя унаследованные сообщения (прямые или косвенные по одному, вызывая некоторую часть из супер), в то время как« построение »объекта (путем init…, new… или copy…) похоже строим дом и укладываем на него крышу, пока никто не уверен, есть ли там подвал. И делать это в то время, как dealloc может быть эквивалентно сносу этого дома, начиная со сноса стен фундамента, не будучи уверенным, что он находится внутри его подвала ».

Хотя использование методов без какого-либо наследования может сделать это тоже, но если они ваши, вы можете (и должны) управлять им.

Привет

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