objc 中的简单 setter 仍然会生成更改值通知

发布于 2024-10-27 06:05:29 字数 365 浏览 5 评论 0原文

我有简单的设置器,例如

- (void) setValue: (int) newVal
{
    value = newVal;
}

valueint 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

も星光 2024-11-03 06:05:29

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: and didChangeValueForKey: 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.

望喜 2024-11-03 06:05:29

你可能想要实现:

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey

在 KVO 指南中搜索苹果文档,它将详细说明如何抑制自动 KVO 通知。

you may want to implement:

+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)theKey

search the apple docs for this in the KVO guide and it will detail how to suppress automatic KVO notification.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文