运行项目时,我在输出窗口中收到以下内容:
An -observeValueForKeyPath:ofObject:change:context: message was received but not handled.
Key path: connection.messageQueue
Observed object: <Client: 0x10011ddb0>
...
你明白了。问题是,我不知道为什么会这样。然而,似乎一切正常。以下是导致问题的代码:
-(id) initWithIdentifier:(NSString*)ident andClient:(Client*)chatClient {
if(![super initWithNibName:@"ChatView" bundle:nil]) {
return nil;
}
[self setTitle: ident];
client = chatClient;
[self setIdentifier:ident];
inContext = false;
[client addObserver:self forKeyPath:@"connection.messageQueue" options:NSKeyValueObservingOptionNew context:NULL];
return self;
}
-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
NSAttributedString* rar = [[NSAttributedString alloc] initWithString:@"test"];
[[textView textStorage] appendAttributedString:rar];
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
我以为我会显示与此相关的所有代码。该类只有几个方法,所以这就是你需要看到的。我甚至没有使用这个改变,我只是在KVO事件被解雇时采取“测试”。
随着消息一直进入,堆栈跟踪变得非常快。但似乎一切正常。
任何线索?
答案 0 :(得分:48)
如果您处理通知,则不应致电[super observeValueForKeyPath:ofObject:change:context:]
。你应该只为你自己处理的通知打电话。
答案 1 :(得分:14)
我遇到了同样的问题: -observeValueForKeyPath:ofObject:change:context:收到邮件但未处理。我在这里搜索过,然后我自己想出来了,所以也许对某人有帮助。
对我来说,问题是:注册为观察者的对象(如果你有 ... addObserver:self ... 那么该对象是 self )在价值发生变化时被释放。但是观察者仍然注册了,因此 nil 观察者收到了-observeValueForKeyPath:ofObject:change:context:
消息。
答案 2 :(得分:0)
确保你只对你不感兴趣的东西调用 super。
<div id="circle"></div>