プロジェクトを実行すると、出力ウィンドウに次のように表示されます。
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イベントが発生したときに「テスト」を実行しているだけです。
メッセージが常に着信するため、スタックトレースは非常に急速に大きくなります。それでも、すべてが正常に機能しているようです。
手がかりはありますか?
通知を処理する場合は、[super observeValueForKeyPath:ofObject:change:context:]
を呼び出さないでください。これは、自分で処理していない通知に対してのみ呼び出す必要があります。
同じ問題が発生しました:-observeValueForKeyPath:ofObject:change:context:メッセージは受信されましたが、処理されませんでした。私はここでグーグルで検索しました、そして私はそれを自分で理解したので、多分それは誰かを助けるでしょう。
私にとっての問題は、オブザーバーとして登録されたオブジェクト(... addObserver:self ...の場合、そのオブジェクトはself)がでリリースされたことです。値が変更された瞬間。しかし、オブザーバーはまだ登録されていたので、-observeValueForKeyPath:ofObject:change:context:
メッセージがnilオブザーバーによって受信されました。