objc 中的简单 setter 仍然会生成更改值通知
我有简单的设置器,例如
- (void) setValue: (int) newVal
{
value = newVal;
}
value
是 int value;
实例变量。
即使我的 setter 没有明确执行任何通知(即它不调用 willChangeValueForKey),使用 [myobj setValue: 10]; 仍然会为观察者生成通知,这怎么可能? code> 也不是 didChangeValueForKey
)。
不确定它是否相关,但我使用的是普通的旧 Mac OS X。这在 iOS 上有什么不同吗?
I have simple setter like
- (void) setValue: (int) newVal
{
value = newVal;
}
where value
is int value;
instance variable.
How is it possible that using [myobj setValue: 10];
still generates notification for observers, even though my setter doesn't do any notification explicitely (i.e. it doesn't call willChangeValueForKey
nor didChangeValueForKey
).
Not sure if it's relevant or not, but I'm using plain old Mac OS X. Is this different on iOS?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Cocoa(和 CocoaTouch)使用一种名为“ 的技术isa-swizzling”用于自动 KVO 支持。
它的工作原理是动态子类化观察对象的类,覆盖观察属性的设置器。重写方法的实现发送
willChangeValueForKey:
和didChangeValueForKey:
消息(当然,在其间调用原始实现)。当设置对象的观察时,该对象的原始 isa 指针(指向该对象的类)将被新的动态创建的子类替换。由于子类不会增加对象的大小,因此可以在不损害内存布局的情况下实现这一点。
Cocoa (and CocoaTouch) use a technique called "isa-swizzling" for automatic KVO support.
It works by dynamically subclassing the class of the observed object, overriding the setter of the observed property. The implementation of the overridden method sends the
willChangeValueForKey:
anddidChangeValueForKey:
messages (and, of course calls the original implementation in between).When observation for an object is set up the object's original isa pointer (pointing to the class of the object) is replaced by the new dynamically created subclass. Since the subclass does not add to the object's size this is possible without harming the memory layout.
你可能想要实现:
在 KVO 指南中搜索苹果文档,它将详细说明如何抑制自动 KVO 通知。
you may want to implement:
search the apple docs for this in the KVO guide and it will detail how to suppress automatic KVO notification.