2010-06-29 77 views
2

是否有使用点符号调用自定义吸气剂的副作用?自定义吸气剂副作用

我一直在使用在Objective-C合成吸气剂经由点表示法,即

tree.fruitnumber 

返回在树果实的数量。我必须定制getter(因为与这个问题不相关的原因)。我写它为

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

令人惊讶的是,点状吸气剂仍然有效。这是合法的,还是有一个令人讨厌的错误(这将会影响我所有的水果(到市场上?))。

回答

6

点符号实际上只是括号符号的语法 - 糖。所以,这两个消息都是一样的:

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

的好处是,你可以@synthesize你的属性和二传手/ getter方法会为你建(取决于你的属性选项,当然),但你可以写你的拥有,而他们将被使用。

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

+0

+1编译器依赖命名约定来查找访问器。它寻找“ - (AttributeType)attributeName'(getter)和' - (void)setAttributeName:(AttributeType)值'形式的方法。只要遵循这些命名约定,就可以对自定义访问器使用点符号。 – TechZen 2010-06-29 03:39:21

+0

@tec绝对如此。 – jbrennan 2010-06-29 05:19:12

+2

如果您在实现中提供自己的getter和setter,则不需要@dynamic。 – JeremyP 2010-06-30 10:52:44

2

无论您是编写getter还是它是合成的,它都会在您使用虚线符号(或括号符号)时被调用。这是它应该工作的方式。

1

点符号仅仅是调用getter或setter方法的简写。除了它的外观之外没有任何区别。

吸气剂中常见的副作用是懒惰的吸气剂。

-(id) something { 
    if (nil == something) { 
    something = ...; 
    } 
    return something; 
} 

吸气剂不必与特定成员相关。它可以返回计算或查找的结果,或者传递成员对象中的某些东西。

4

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

  • 原子性 - 如果你不声明属性为nonatomic,然后(默认),它是一个原子属性,这意味着价值的属性将被完整检索,无论其他线程可能在同一时间对属性进行变异。如果你有一个atomic属性,然后重写getter或setter,那么你失去了原子性(除非你自己实现它)。
  • 关键值观察 - 通过使用@synthesized方法,您可以确保KVO符合性,从而可以非常容易地观察对象更改(以及被通知此类更改)时的值。如果您覆盖合成的方法,则可能会违反合规性。

所以它一般是安全的替代合成getter和setter,但有警告,这是非常重要的,你了解它们是什么,这样,如果/当事情打破,你知道为什么。

+0

您能否举一个例子来说明自定义setter或getter会违反KVO合规性的情况?不是我不相信你,我以前从来没有想过,并且很好奇,以避免造成问题。 – jbrennan 2010-06-29 23:35:09

+1

@jbrennan如果您实施自定义设置器,并且要确保遵守KVO,则需要使用自动或手动KVO。 http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/KeyValueObserving/Concepts/AutoVsManual.html#//apple_ref/doc/uid/20001844-BAJEAIEE – JeremyP 2010-06-30 11:01:38

3

申报财产时,可以指定一个自定义的getter,即:

@property (readwrite, getter=numberOfFruitsCountedByTheCustomGetter) int fruitnumber; 

在您的实现,合成它像往常一样:

@synthesize fruitnumber; 

然后实现吸气:

- (int) numberOfFruitsCountedByTheCustomGetter { 
    return fruitnumber; 
}