在删除观察者后立即更改财产仍然发出KVO通知

时间:2015-12-07 20:20:41

标签: objective-c cocoa key-value-observing objective-c-runtime

我有一些属性正在发生变化的情况,但我不想通知观察者这一变化。

代码如下所示:

  [self.fontColorWell removeObserver:self.toolController forKeyPath:@"color"];
  [self.fontColorWell setColor:[self.toolController valueForKey:[self fontColorKeyPath]]];

不幸的是,当第二行执行时,self.toolController上的观察者(self.fontColorWell)仍会收到通知。

我很确定我知道为什么会这样,因为KVO通过运行时子类对观察到的类进行操作,并覆盖被观察的属性以添加didChangewillChange消息。 (https://www.mikeash.com/pyblog/friday-qa-2009-01-23.html

如果我在第二行设置断点,我可以清楚地看到self.fontColorWell的类类型:NSKVONotifying_NSColorWell。因此,当调用-setColor时,它仍然在运行时子类上调用,该子类具有通知观察者的重写setter。

但是我认为因为我之前调用了removeObserver,所以不应该从KVO查找表中删除观察者,因此即使KVO对象通知观察者,我的self.toolController也不应该收到通知?

我100%知道,当-setColor被调用时,self.toolController会立即收到-observeValueForKeyPath...消息。我也很肯定所有的物品都没有多余的物体悬挂在

我是不是被允许做我想做的事情?或者我是以错误的方式解决这个问题?

0 个答案:

没有答案