(обратите внимание, что я предполагаю, что приведенный выше код ARC; в противном случае он неверен.)
Вы почти всегда должны использовать средства доступа для доступа к своим иварам (даже в ARC).Тем не менее, есть некоторые противоречия по поводу того, должен ли init
использовать средства доступа или иметь прямой доступ к своим иварам.Я перешел на другую сторону в этом противоречии, но это не очевидное решение IMO.
Основной аргумент в пользу того, что init
не может использовать средства доступа, заключается в том, что в будущем (неизвестный) подкласс может создатьэффекты в аксессоре.Обычно вы не хотите, чтобы побочные эффекты происходили во время вашего init
.Например, вы, вероятно, не хотите публиковать уведомления об изменениях, когда устанавливаете что-либо на его начальное значение, и возможно, что ваш объект находится в «неопределенном состоянии» и в этом случае его было бы опасно читать.
Тем не менее, и хотя этот аргумент наконец-то меня поколебал, я ни разу не сталкивался с такой ситуацией в многочисленных проектах разных размеров с несколькими командами.Я много раз сталкивался с ошибками разработчиков retain
при установке их иваров в init
(как вы делали выше, и которые вылетали бы, если это не ARC).Вот почему я долгое время рекомендовал использовать аксессоры даже в init
.Но в теории это создает опасность, особенно если вы пишете фреймворк с закрытым исходным кодом (например, Apple).Итак, для моего собственного кода я теперь избегаю доступа в init
.Если бы я работал с более младшими командами над старым кодом сохранения / выпуска, я бы, вероятно, все равно использовал их в init
.В моем опыте удалось избежать стольких сбоев.
Однако не вызывает сомнений то, что вам следует избегать вызова методов доступа в dealloc
.Это определенно может привести к причудливым побочным эффектам в середине разрушения вашего объекта.