Должен ли я использовать само ключевое слово (свойства) в реализации? - PullRequest
11 голосов
/ 27 июня 2009

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

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

self.myProperty = [someObject someAutoReleasedObject];

вместо:

myProperty = [[someObject someAutoReleasedObject] retain];

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

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

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

Ответы [ 2 ]

5 голосов
/ 27 июня 2009

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

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

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

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

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

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

self.name // use property
i_name // use ivar
self.i_name // syntax error
name // syntax error
0 голосов
/ 27 июня 2009

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

...