在Objective-C中,我想知道自定义setter是否会覆盖KVO支持(willChangeValueForKey:和didChangeValueForKey;)并且我是否需要在自定义setter中明确包含对这些的调用?
保留和复制怎么样?我是否需要明确地包含发布并保留或复制具有保留或复制属性的属性的设置器(对于非ARC代码)?
答案 0 :(得分:5)
如果您的访问者采用标准格式(-setFoo:
和-foo
),KVO将自动生效。但是,保留并复制,您需要在自定义访问器中管理自己。
这是因为retain和copy是合成访问器的一部分,而KVO仅基于方法名称。请查看here以获取符合KVO标准的方法命名的完整说明。
答案 1 :(得分:2)
查看Apples Advanced memory management programming,告诉您如何正确实施自己的getter / setter:
答案 2 :(得分: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
}
}
}
如果你的setter不符合guildlines,请查看“手动更改通知”部分。