【问题标题】:Can Custom Setters Break KVO Pattern? Break Retain or Copy Pattern?自定义设置器可以打破 KVO 模式吗?打破保留或复制模式?
【发布时间】:2012-02-03 20:53:59
【问题描述】:
在 Objective-C 中,我想知道自定义 setter 是否会覆盖 KVO 支持(willChangeValueForKey: 和 didChangeValueForKey;),我是否需要在自定义 setter 中明确包含对这些的调用?
保留和复制呢?对于具有 Retain 或 Copy 属性的属性(对于非 ARC 代码),我是否需要在 setter 中明确包含 release 和 retain 或 copy?
【问题讨论】:
标签:
objective-c
properties
key-value-observing
【解决方案1】:
如果您的访问器采用标准格式(-setFoo: 和 -foo),KVO 将自动运行。保留和复制,但是,您需要在自定义访问器中管理自己。
这是因为保留和复制是合成访问器的一部分,而 KVO 仅基于方法名称。查看here 以获取符合 KVO 的方法命名的完整描述。
【解决方案3】:
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 不符合规范,请查看“手动更改通知”部分。