【发布时间】:2013-05-29 02:21:38
【问题描述】:
短版:
-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];
}
【问题讨论】:
标签: objective-c cocoa key-value-observing