2

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

我在类别界面中使用如下属性声明进行了一些实验:

@property NSString* details;

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

由于没有直接与属性绑定的 ivar,因此添加保留或复制的属性没有任何意义。

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

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

我编译并运行了代码。我使用点符号测试了这些方法。我可以看到访问器可以成功使用而不会出现错误并且编译器不会抱怨。

我读到的关于点表示法的内容告诉我,如果我以某种方式设置属性,我可以使用点表示法。但我没有设置符合该要求的属性。但看来我仍然可以使用点表示法。

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

4

1 回答 1

2

点表示法旨在用于声明的属性访问,但实际上编译器对它的处理非常松散,如果您不分配结果,则可以使用任何无参数方法:

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

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

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

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

废话,废话,我想你已经知道了。目前我能找到的唯一相关文档是TOCPL中的这句话:

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

于 2012-05-01T18:16:10.077 回答