Должен ли я использовать собственные ключевые слова (свойства) в реализации?

Полагаю, что я понимаю свойства по большей части. Мой вопрос: если у меня есть свойство для переменной экземпляра, и я устанавливаю или извлекаю его из метода в моем файле реализации, должен ли я использовать self.myProperty или просто myProperty? Я знаю, что любой из них работает, но я видел смешанные соглашения, иногда код получает доступ к переменной напрямую и в другое время через свойство.

Есть ли техническая причина для этого? Это просто условное/личное предпочтение? И я не имею в виду экземпляры, где имя параметра метода сталкивается с именем переменной экземпляра, что может быть одной из причин использования свойства (по крайней мере, на других языках я не знаю об этом). Я предполагаю, что, когда вы используете свойство внутри реализации, они хотят использовать способ, которым они объявили свойство (т.е. Неатомное, сохранить), например, например, в методе:

self.myProperty = [someObject someAutoReleasedObject];

вместо:

myProperty = [[someObject someAutoReleasedObject] retain];

Это причина? Так существуют ли только определенные ситуации, в которых было бы хорошо использовать свойство?

Я новичок в Objective-C, и это одна из немногих вещей, которые меня путают. До сих пор я просто обращался к переменной экземпляра напрямую, по наиболее вероятному ложному предположению, что через свойство на самом деле вызывает/отправляет метод/сообщение и добавляет лишние накладные расходы. Я уверен, что я ошибаюсь в этом, но даже если разница в накладных расходах незначительна (если их даже нет), почему бы их выбрать, чтобы добавить их, когда можно просто напрямую получить доступ к переменной?

Я уверен, что ошибаюсь в своих мыслях, поэтому я спрашиваю здесь.

Ответ 1

Во-первых, вы не должны использовать сеттеры или геттеры в init или dealloc в соответствии с документацией Apple (и по уважительным причинам).

Кроме этого, вы должны, как правило, использовать установщик для установки переменной, если она есть.

Обычно я не хочу использовать getter для доступа к ivar из реализации, но есть моменты, когда это необходимо. В частности, если вы ожидаете, что геттер может выполнить некоторую какуляцию или проверку, или если вы хотите разрешить подклассам переопределять поведение.

Конечно, использование геттера в реализации более общее и безопасное, но оно также обычно бессмысленно и расточительно. Сделайте свой выбор.

Использование setter важно, поскольку оно дает возможность использовать другой код для отслеживания изменений (Key Value Observing), а также подклассы, чтобы переопределить сеттер и внести любые другие необходимые настройки.

Однако я настоятельно рекомендую использовать другое имя для вашего ivar и вашего имущества. Обычное соглашение является префиксом подчеркивания (_), хотя я лично использую i_ в качестве префикса, чтобы избежать путаницы с частным использованием Apple. Таким образом, вы не можете случайно использовать неправильный:

self.name // use property
i_name // use ivar
self.i_name // syntax error
name // syntax error

Ответ 2

Если вы подвергаете свойство внешнему миру и используете его внутри себя, вы должны использовать свойство во всем своем коде. Причина заключается в инкапсуляции. Скажем, у вас есть свойство "Id" для SomeObj. Скажите, что в какой-то момент вы решили заменить способ поведения Id (возможно, вы начали с того, что Id является членом var класса, а через эволюцию он становится частью данных, которые извлекаются из базы данных). Теперь вам нужно пройти через реализацию класса и заменить все ссылки на переменную-член с вызовами базы данных. Если у вас есть self.Id, вам просто нужно переопределить получателя.