23

プロジェクトを実行すると、出力ウィンドウに次のように表示されます。

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イベントが発生したときに「テスト」を行っているだけです.

メッセージが常に入ってくるため、スタック トレースは非常に急速に大きくなります。それでも、すべてが正常に機能しているようです。

手がかりはありますか?

4

3 に答える 3

50

[super observeValueForKeyPath:ofObject:change:context:]通知を処理する場合は、電話しないでください。これは、自分で処理しない通知に対してのみ呼び出す必要があります。

于 2012-09-04T19:55:24.957 に答える
16

同じ問題が発生しました:-observeValueForKeyPath:ofObject:change:context:メッセージは受信されましたが、処理されませんでした。私はここでグーグルして、それから私はそれを自分で理解したので、多分それは誰かを助けるでしょう。

私にとっての問題は、値が変更された時点で、オブザーバーとして登録されたオブジェクト( ... addObserver:self ...の場合、そのオブジェクトはself )が解放されたことです。しかし、オブザーバーはまだ登録されていたので、-observeValueForKeyPath:ofObject:change:context:メッセージはnilオブザーバーによって受信されました。

于 2013-01-17T08:01:47.777 に答える