在Objective C中使用点表示法有哪些要求?

时间:2012-05-01 18:08:00

标签: objective-c syntax properties categories

我想在类别中创建一个属性,因此我可以使用带有访问器的点表示法。我想这样做的原因是我可以重构一些引用NSMangedObject属性的现有代码。然后我将类别访问器方法放在外部调用者和它们相关的NSManagedObject属性之间。 (我不想用消息传递替换当前的点符号用法,因为我在一个非常大的项目中使用点符号。)

我在类别界面中尝试了一下这样的属性声明:

@property NSString* details;

这会导致编译器警告(它不喜欢默认的assign属性。)

由于没有与该属性直接相关的ivar,因此添加retain或copy属性是没有意义的。

接下来,我刚刚省略了@property行,并为接口和实现文件添加了访问器。

- (void) setDetails:(NSString*)details;
- (NSString*) details;

我编译并运行了代码。我用点符号测试了这些方法。我可以看到访问器可以成功使用而没有错误,也没有编译器抱怨。

我读到的关于点符号的内容告诉我,如果我以某种方式设置属性,我可以使用点符号。但我没有建立符合该要求的房产。但似乎我仍然可以使用点符号。

这种方法有什么问题吗?是否有规范定义了如何以及何时使用点符号访问器?

1 个答案:

答案 0 :(得分:2)

点符号旨在用于声明的属性访问,但实际上编译器会松散地处理它,如果您没有分配结果,则可以使用任何无参数方法:

 aString.lowercaseString;
 aNumber.intValue;
 aDict.allKeys;

同样,如果对象上有set<uppercase name>:形式的单参数方法,编译器将允许您使用点语法表达式,就像它是左值一样:

aString.string = @"Amazing";
aWindow.alphaValue = 0.45;

即使该名称未使用@property语法声明。

Blah,等等,我猜你已经知道了。我现在可以挖掘的唯一相关文档是来自TOCPL的这句话:

  

然而,当与对象一起使用时,点语法充当“语法糖” - 编译器将其转换为访问器方法的调用。