在Objective-C中,我不知道自定义设置器是否会覆盖KVO支持(willChangeValueForKey:和didChangeValueForKey;),并且是否需要在自定义设置器中明确包含对这些的调用?定制Setter可以打破KVO模式吗?打破保留或复制模式?
保留和复制怎么样?我是否需要明确包含版本并保留或复制setter中的属性(保留或复制属性)(非ARC代码)?
在Objective-C中,我不知道自定义设置器是否会覆盖KVO支持(willChangeValueForKey:和didChangeValueForKey;),并且是否需要在自定义设置器中明确包含对这些的调用?定制Setter可以打破KVO模式吗?打破保留或复制模式?
保留和复制怎么样?我是否需要明确包含版本并保留或复制setter中的属性(保留或复制属性)(非ARC代码)?
如果您的访问器采用标准格式(-setFoo:
和-foo
),KVO将自动工作。但是,保留并复制,您需要在自定义访问器中管理自己。
这是因为保留和复制是合成访问器的一部分,而KVO完全基于方法名称。有关KVO兼容方法命名的完整说明,请查询here。
的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看看“手动更改通知”部分。
看看Apples Advanced memory management programming,它告诉你如何正确实施你自己的getters/setters: