我想知道重新定义财产的吸气剂是否有用。
documentation声明我们可以使用getter
重新定义属性的getter:
@property (getter=isFinished) BOOL finished;
根据我的理解,呼叫者应该使用:
MyObj *obj = ...;
obj.isFinished;
但没有什么可以阻止你这样做:
MyObj *obj = ...;
obj.finished;
由于财产本身仍然可以自由访问,重新定义吸气剂的重点是什么?
这样做不会更简洁和可读:
@property BOOL isFinished;
答案 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
允许通常被认为具有良好可读性的isFinished
或if ([obj isFinished]) ...
。
因此,命名和隐私是独立的概念。
答案 2 :(得分:-1)
因为根据命名惯例,您可以更好地了解该属性。它是您的需求所必需的。