如果没有Objective-C中的显式@property,点语法如何工作?

Jus*_*ers 1 cocoa objective-c

我按照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;
Run Code Online (Sandbox Code Playgroud)

Pet*_*sey 5

属性访问表达式等同于消息表达式:

[object setTexture:tex];
Run Code Online (Sandbox Code Playgroud)

属性声明等效于一(readonly)或两个(readwrite/ default)实例方法声明.关键词如retain告诉编译器如果你告诉它如何实现该方法(@synthesize).

但是,您可以跳过属性声明并直接声明方法,如问题所示.你不能合成它们的实现,因为你需要一个财产申报(否则,就不会知道什么是内存管理策略中使用:assign,retain,或copy),但你总是可以自己实现方法.

然后,即使您自己声明并实现了这些方法,由于属性访问语法和消息语法彼此等效,您可以使用所需的方法:使用消息表达式或使用属性访问表达式.

有些人会认为这是不好的形式,不过,任何东西使用属性访问表达式,但正式的@property(例如,myString.lengthmyArray.countmyView.frame).使用属性访问表达式发送不访问任何类型属性的消息肯定是不好的形式; foo.retain.autorelease例如,是坏事和错误:它试图假装你正在编写除Objective-C之外的其他语言.

顺便提及,属性和变量是不相关的.A @property通常由实例变量支持,但这不是必需的:您可以将属性的值存储在另一个对象中,或将其转换为其他格式或从其他格式转换为两者.同样,访问属性(这是一个访问者消息)和访问实例变量(只是访问变量,仅此而已)是非常不同的.