我正在尝试使用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
时我还能在哪里做到这一点。
答案 0 :(得分:1)
您实际上并未将视图注册为addObserver:forKeypath:options:context:
的观察者。您应该将自己注册为观察者,或者(如果您不以标准方式使用KVO,手动发送observeValueForKeyPath...
),则不应尝试取消注册自己作为观察者。