“收到的消息但未处理”KVO

时间:2012-09-04 19:52:45

标签: objective-c key-value-observing

运行项目时,我在输出窗口中收到以下内容:

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事件被解雇时采取“测试”。

随着消息一直进入,堆栈跟踪变得非常快。但似乎一切正常。

任何线索?

3 个答案:

答案 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>