Как работает точечный синтаксис без явного @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
будет обычно поддерживаться переменной экземпляра, но это не обязательно: вы можете сохранить значение свойства в другом объекте, или преобразовать его в какой-либо другой формат, или в оба. Аналогично, доступ к свойству (которое является сообщением-аксессором) и доступ к переменной экземпляра (которая просто обращается к переменной, ничего более) сильно различаются.