Как работает точечный синтаксис без явного @property в Objective-C?

Я написал метод установки и получения, следуя соглашениям Apple, и заметил, что, несмотря на отсутствие переменных, я все равно могу получить доступ к установщику и получателю, используя синтаксис точки. Это нормальное поведение? Что включает эту функцию?

Пример:

// Header definition. Keep in mind there is no class variable or @property for height.
- (void)setHeight:(float)height;
- (float)height;

// else using the dot syntax.
object.height = 10.0f;

1 ответ

Решение

Выражение доступа к свойству эквивалентно выражению сообщения:

[object setTexture:tex];

Объявление свойства эквивалентно одному (readonly) или два (readwrite/ default) объявления метода экземпляра. Ключевые слова как retain скажите компилятору, как реализовать метод, если вы скажете ему сделать это (@synthesize).

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

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

Однако некоторые считают плохой формой использовать выражения доступа к свойствам на чем угодно, кроме формальных @property (например, myString.length или же myArray.count или же myView.frame). Это определенно плохая форма - использовать выражение доступа к свойству для отправки сообщения, которое не имеет доступа к какому-либо свойству; foo.retain.autoreleaseНапример, это плохо и неправильно: оно пытается притвориться, что вы программируете какой-то другой язык, кроме Objective-C.

Между прочим, свойство и переменная не связаны. @property будет обычно поддерживаться переменной экземпляра, но это не обязательно: вы можете сохранить значение свойства в другом объекте, или преобразовать его в какой-либо другой формат, или в оба. Аналогично, доступ к свойству (которое является сообщением-аксессором) и доступ к переменной экземпляра (которая просто обращается к переменной, ничего более) сильно различаются.

Другие вопросы по тегам