定制吸气剂副作用

时间:2010-06-29 03:25:19

标签: ios objective-c

使用点表示法调用自定义getter是否会产生副作用?

我曾使用点符号在Objective-C中使用合成的吸气剂,即

tree.fruitnumber

返回树中的水果数量。我不得不定制吸气剂(原因与此问题无关)。我把它写成

-(int) fruitnumber
{
   //climb into tree and hand count fruits. Get n;
   return n;
}

令人惊讶的是,虚线的吸气剂仍然有效。这是合法的,还是有一个令人讨厌的错误(它会影响我的所有成果(对市场?)。

6 个答案:

答案 0 :(得分:6)

点符号实际上只是用于括号表示的语法糖。所以两条消息都是一样的:

int x = [self fruitNumber];
int x = self.fruitNumber;

好处是,你可以@synthesize你的属性和setter / getter方法将为你构建(当然,取决于你的属性选项),但你可以编写自己的属性,它们将被使用

如果您提供自己的setter / getter,您也可以使用@dynamic propertyName行而不是@synthesize告诉编译器这些是由您提供的。

答案 1 :(得分:4)

没有人提到过一些副作用:

  • Atomicity - 如果您没有将属性声明为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属性的链接。如果你有机会,这是值得的。

http://developer.apple.com/mac/library/iPad/index.html#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html