具有重新定义的访问者的属性仍可访问

时间:2013-08-13 09:07:39

标签: objective-c

我想知道重新定义财产的吸气剂是否有用。 documentation声明我们可以使用getter重新定义属性的getter:

@property (getter=isFinished) BOOL finished;

根据我的理解,呼叫者应该使用:

MyObj *obj = ...;
obj.isFinished;

但没有什么可以阻止你这样做:

MyObj *obj = ...;
obj.finished;

由于财产本身仍然可以自由访问,重新定义吸气剂的重点是什么?

这样做不会更简洁和可读:

@property BOOL isFinished;

3 个答案:

答案 0 :(得分:1)

声明的属性名为“finished”。 getter方法是isFinished,但这并不会使obj.isFinished成为正确的点语法。 Dot语法应该使用属性的名称,而不是getter。这或多或少是obj.isFinished编译的事故。它不是对已声明的“已完成”属性的引用。编译器有效地搜索隐式属性,并且隐式定义属性的一件事是存在一个不带参数并返回值的方法。因此,您有一个明确的“已完成”属性和一个隐含的“isFinished”属性。

例如,您可以滥用点语法通过-[NSTask suspend]调用someTask.suspend。 “suspend”实际上并不是属性的名称,甚至不是getter,但编译器无法区分getter和不带参数的方法并返回值,因此它可以让你逃脱它。当然,这是一个坏主意。

当然,你的obj.isFinished不是那样的滥用,因为你正在调用一个真正的吸气剂。只是当编译器弄清楚你正在做什么时,编译器没有引用声明的属性,它只是注意到存在正确形式的方法。

答案 1 :(得分:0)

通过@property (getter=isFinished) BOOL finished;声明一个显式的getter,一个隐式的setter,一个隐式的ivar。 (在以前版本的ObjC中,你还需要一个`@synthesize)。 然而,吸气剂/定位器不需要使用自动静脉注射器,甚至根本不需要使用静脉注射器。因此,你可以拥有私人伊娃,或设置一些伊娃,或做任何其他'魔术'。

点语法只是避免[]的语法糖。

修改 直到这里,我回答了你的问题“重新定义吸气剂有什么意义?”。

回答姓名/隐私部分: 如果你只想要一个BOOL,你的第一个选择就好了。如果你想要一个受保护/私有的ivar,以这种方式声明ivar,并编写你自己的getter / setter。

要命名属性isFinished通常被认为不太好(除非它是只读属性),因为原始设置(不是点语义)看起来setIsFinished:val(而不是{{1 ,),被认为不那么容易阅读。但是,要有一个getter setFinished:val允许通常被认为具有良好可读性的isFinishedif ([obj isFinished]) ...

因此,命名和隐私是独立的概念。

答案 2 :(得分:-1)

因为根据命名惯例,您可以更好地了解该属性。它是您的需求所必需的。