-1

次のような別のオブジェクトからのいくつかの変更のために、あるオブジェクトをサブスクライブしました。

[objA addObserver:self
       forKeyPath:keyPath
          options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
      context:nil];

そして、変更が加えられると、

- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

と呼ばれます。

ただし、変更辞書の「新しい」キーと「古い」キーの値は常に同じです。この問題は、iOS 4.x でのみ再現可能です。iOS 5.x では正常に動作します。助言がありますか?

4

1 に答える 1

0

それは、観察しているものと、そのオブジェクトがどのように変化したかによって異なります。特に、オブジェクト ポインターが変更されていない場合、そのオブジェクトの一部のプロパティ/属性が変更されています (たとえば、NSMutableArray があり、配列に値を追加しただけで、NSMutableArray 自体のアドレスは変更されていません)。新しいポインターと古いポインターは実際には同じオブジェクトを指しているため、変更されていないように見えます。このような場合、変更の通知さえ受け取れないことがよくありますが、カスタム セッターなどでwillChangeValueForKeyandを手動で呼び出してもdidChangeValueForKey、古い値は新しい値と同じように見えます。オブジェクトの新しいコピーを実際に作成し、古いコピーを解放するように値を変更するコードを変更すると、新しい値と古い値が変更されていることがわかります。

オブジェクトもKVO Compliantであることを確認してください。

さらにヘルプが必要な場合は、変更するオブジェクトとその変更方法について、より具体的な情報 (特にソース コード) を提供する必要があります。

于 2012-05-15T23:06:26.983 に答える