精简版:
有什么用-removeObserver:forKeyPath:
?
为什么不总是使用-removeObserver:forKeyPath:context:
?
长版
在开发 Cocoa 程序时,我发现使用-removeObserver:forKeyPath:
可能(但并非总是)会导致如下错误:
Cannot remove an observer <ObservedClass 0x1001301d0> for the key path "exampleKeyPath" from <__NSCFConstantString 0x100009138> because it is not registered as an observer.
而使用-removeObserver:forKeyPath:context:
代替会工作得很好。
由于在设置观察时需要指定上下文(使用 -observeValueForKeyPath:ofObject:change:context:
),我对为什么context:
存在 -less 删除方法感到困惑。
根据我对NSKeyValueObserving Protocol的阅读,我认为删除可能适用于所有上下文中的指定观察者和指定键路径,但是-removeObserver:forKeyPath:
(没有上下文)无法替代-removeObserver:forKeyPath:context:
(上下文为NULL
)似乎击落这个想法。
那么:为什么我会出现这个错误?上下文有什么作用-removeObserver:forKeyPath:
?它与context:
装备精良的弟弟有何不同?
代码示例
有问题的代码:
-(void) invalidate {
[(id)observedObject removeObserver:self
forKeyPath:@"exampleKeyPath"];
}
非问题代码:
-(void) invalidate {
[(id)observedObject removeObserver:self
forKeyPath:@"exampleKeyPath"
context:NULL];
}