0

我想知道重新定义属性的吸气剂的用处。文档指出,我们可以使用以下方法重新定义属性的getter getter

@property (getter=isFinished) BOOL finished;

据我了解,调用者应该使用:

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

但没有什么能阻止你做:

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

既然属性本身仍然可以自由访问,那么重新定义 getter 有什么意义呢?

这样做不是更简洁易读吗:

@property BOOL isFinished;
4

3 回答 3

1

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

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

当然,您obj.isFinished不是那样的滥用,因为您正在调用实际的吸气剂。只是编译器在确定您在做什么时并没有引用声明的属性,它只是注意到存在正确形式的方法。

于 2013-08-14T05:26:21.740 回答
0

通过@property (getter=isFinished) BOOL finished;声明显式 getter、隐式 setter隐式 ivar。(在以前的 ObjC 版本中,您还需要一个 `@synthesize)。但是,getter/setter 不需要使用自动 ivar,甚至根本不需要 ivar。因此,您可以拥有一个私有 ivar,或设置多个 ivar,或执行任何其他“魔术”。

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

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

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

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

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

于 2013-08-13T09:45:50.090 回答
-1

因为通过命名约定,您将更好地了解该属性。它是您的需要所必需的。

于 2013-08-13T09:45:23.890 回答