使用点表示法调用自定义getter是否会产生副作用?
我曾使用点符号在Objective-C中使用合成的吸气剂,即
tree.fruitnumber
返回树中的水果数量。我不得不定制吸气剂(原因与此问题无关)。我把它写成
-(int) fruitnumber
{
//climb into tree and hand count fruits. Get n;
return n;
}
令人惊讶的是,虚线的吸气剂仍然有效。这是合法的,还是有一个令人讨厌的错误(它会影响我的所有成果(对市场?)。
答案 0 :(得分:6)
点符号实际上只是用于括号表示的语法糖。所以两条消息都是一样的:
int x = [self fruitNumber];
int x = self.fruitNumber;
好处是,你可以@synthesize
你的属性和setter / getter方法将为你构建(当然,取决于你的属性选项),但你可以编写自己的属性,它们将被使用
如果您提供自己的setter / getter,您也可以使用@dynamic propertyName
行而不是@synthesize
告诉编译器这些是由您提供的。
答案 1 :(得分:4)
没有人提到过一些副作用:
nonatomic
,那么(默认情况下)它是一个原子属性,这意味着无论其他线程是什么,都将检索该属性的值。做同时改变财产。如果你有一个原子属性,然后覆盖getter或setter,你将失去原子性(除非你自己实现)。@synthesized
方法,您可以确保符合KVO,这使得在对象更改时(以及通知此类更改)很容易观察到对象的值。如果覆盖合成方法,则可能会违反合规性。因此,覆盖合成的getter和setter通常是安全的,但有警告,非常重要的是你明白它们是什么,以便if / when事情破裂,你知道为什么。
答案 2 :(得分:3)
您可以在声明属性时指定自定义getter,即:
@property (readwrite, getter=numberOfFruitsCountedByTheCustomGetter) int fruitnumber;
在您的实现中,照常合成它:
@synthesize fruitnumber;
然后实现getter:
- (int) numberOfFruitsCountedByTheCustomGetter {
return fruitnumber;
}
答案 3 :(得分:2)
无论是编写getter还是合成它都无关紧要,当使用点分表示法(或括号表示法)时会调用它。这是它应该工作的方式。
答案 4 :(得分:1)
点符号只是调用getter或setter方法的简写。除了它的外观之外没有区别。
吸气剂中常见的副作用是懒惰的吸气剂。
-(id) something {
if ( nil == something ) {
something = ...;
}
return something;
}
getter不必与特定成员相关。它可以返回计算或查找的结果,或者从成员对象传递某些内容。
答案 5 :(得分:0)
Progrmr是对的。但是我会考虑在@dynamic声明中明确告诉编译器你正在创建getter。这是文档om属性的链接。如果你有机会,这是值得的。