我应该如何取消注册KVO?

时间:2011-02-02 06:27:10

标签: iphone key-value-observing

我正在尝试使用KVO来观察UIView子类的属性,以便通过调用drawRect:来触发绘图。在我的initWithFrame:中,我有这个:

...
self.observedKeysThatTriggerRedraw = [NSArray arrayWithObjects:@"name", nil];
for (NSString *aKey in self.observedKeysThatTriggerRedraw) {
    [self observeValueForKeyPath:aKey ofObject:self change:nil context:redrawContextString];
}
...

redrawContextString是此类唯一的常量NSString

KVO通知按照应有的方式触发,这正在触发正确的重绘。问题是取消注册KVO。如果我没有取消注册,一切运行正常,但如果我把它放在dealloc的顶部,我会得到一个例外:

for (NSString *aKey in self.observedKeysThatTriggerRedraw) {
    [self removeObserver:self forKeyPath:aKey];
}

self.name = nil;
...
[super dealloc];

我在控制台中收到此消息,并在到达removeObserver:forKeyPath:时发生崩溃:

  

CoreAnimation:忽略异常:无法移除观察者< MyViewClass 0x5b47210>对于来自< MyViewClass 0x5b47210>的关键路径“name”因为它没有注册为观察员

当您观察self时,是否有一些技巧可以取消注册KVO?我的观察员是否在注册dealloc之前未注册?我已经阅读了很多地方你不应该在dealloc取消注册KVO,但我不确定在观察self时我还能在哪里做到这一点。

1 个答案:

答案 0 :(得分:1)

您实际上并未将视图注册为addObserver:forKeypath:options:context:的观察者。您应该将自己注册为观察者,或者(如果您不以标准方式使用KVO,手动发送observeValueForKeyPath...),则不应尝试取消注册自己作为观察者。