2012-02-03 67 views
0

在Objective-C中,我不知道自定义设置器是否会覆盖KVO支持(willChangeValueForKey:和didChangeValueForKey;),并且是否需要在自定义设置器中明确包含对这些的调用?定制Setter可以打破KVO模式吗?打破保留或复制模式?

保留和复制怎么样?我是否需要明确包含版本并保留或复制setter中的属性(保留或复制属性)(非ARC代码)?

回答

5

如果您的访问器采用标准格式(-setFoo:-foo),KVO将自动工作。但是,保留并复制,您需要在自定义访问器中管理自己。

这是因为保留和复制是合成访问器的一部分,而KVO完全基于方法名称。有关KVO兼容方法命名的完整说明,请查询here

1

docs状态:

自动支持由NSObject的提供,在默认情况下适用于通过键 - 值编码兼容 一类的所有属性。通常,如果您遵循标准Cocoa编码并命名为 约定,则可以使用自动更改通知 - 您没有 可以编写任何其他代码。

如果你有一个setter,只要符合命名约定。

关于复制/保留:

- (void)setFoo:(id)bar { 
    @synchronized (self) { // synchronize if you have to, can be omitted in most cases 
    if (bar_ != bar) { // bar_ is the ivar 
     [bar_ release]; // omit in ARC 
     bar_ = [bar copy]; // resp. retain in other variant 
    } 
    } 
} 

如果您的二传手不符合guildlines看看“手动更改通知”部分。