我想在类别中创建一个属性,因此我可以使用带有访问器的点表示法。我想这样做的原因是我可以重构一些引用NSMangedObject属性的现有代码。然后我将类别访问器方法放在外部调用者和它们相关的NSManagedObject属性之间。 (我不想用消息传递替换当前的点符号用法,因为我在一个非常大的项目中使用点符号。)
我在类别界面中尝试了一下这样的属性声明:
@property NSString* details;
这会导致编译器警告(它不喜欢默认的assign属性。)
由于没有与该属性直接相关的ivar,因此添加retain或copy属性是没有意义的。
接下来,我刚刚省略了@property行,并为接口和实现文件添加了访问器。
- (void) setDetails:(NSString*)details;
- (NSString*) details;
我编译并运行了代码。我用点符号测试了这些方法。我可以看到访问器可以成功使用而没有错误,也没有编译器抱怨。
我读到的关于点符号的内容告诉我,如果我以某种方式设置属性,我可以使用点符号。但我没有建立符合该要求的房产。但似乎我仍然可以使用点符号。
这种方法有什么问题吗?是否有规范定义了如何以及何时使用点符号访问器?
答案 0 :(得分:2)
点符号旨在用于声明的属性访问,但实际上编译器会松散地处理它,如果您没有分配结果,则可以使用任何无参数方法:
aString.lowercaseString;
aNumber.intValue;
aDict.allKeys;
同样,如果对象上有set<uppercase name>:
形式的单参数方法,编译器将允许您使用点语法表达式,就像它是左值一样:
aString.string = @"Amazing";
aWindow.alphaValue = 0.45;
即使该名称未使用@property
语法声明。
然而,当与对象一起使用时,点语法充当“语法糖” - 编译器将其转换为访问器方法的调用。