我按照Apple的惯例编写了一个setter和getter方法,并注意到尽管没有变量,我仍然可以使用点语法访问setter和getter。这是正常的行为吗?什么启用此功能?
示例:
// 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;
答案 0 :(得分:5)
属性访问表达式等同于消息表达式:
[object setTexture:tex];
属性声明等同于一个(readonly
)或两个(readwrite
/ default)实例方法声明。像retain
这样的关键字告诉编译器如果你告诉它如何实现该方法(@synthesize
)。
但是,您可以跳过属性声明并直接声明方法,如问题所示。您无法综合他们的实现,因为您需要一个属性声明(否则,它不知道要使用的内存管理策略:assign
,retain
或copy
),但你总是可以自己实现这些方法。
然后,即使您自己声明并实现了这些方法,因为属性访问语法和消息语法彼此相同,您可以使用您想要的方法:使用消息表达式或使用属性访问表达
但是,有些人认为,除了正式的@property
(例如,myString.length
或myArray.count
或myView.frame
)之外的所有内容都使用属性访问表达式。使用属性访问表达式发送不访问任何类型属性的消息肯定是不好的形式;例如,foo.retain.autorelease
是坏的和错误的:它试图假装你正在编写除Objective-C之外的其他语言。
顺便提一下,属性和变量是无关的。 @property
通常由实例变量支持,但这不是必需的:您可以将属性的值存储在另一个对象中,或者将其转换为其他格式或从其他格式转换为两者。同样,访问属性(这是一个访问者消息)和访问实例变量(只是访问变量,仅此而已)是非常不同的。