1

奇妙な問題があります。

私のクラスは、C++ オブジェクトへのポインターを保持するだけのプロパティを宣言します。

@property (assign) CPPObject *representedObject;

そのinitObj-C クラスで、クラス自体をオブザーバーとして登録して、誰かが私のプロパティに何かを割り当てたときに通知を受け取ります (ええ、カスタム セッターを作成できます....誰でも!)。

   [self addObserver:self
          forKeyPath:@"representedObject"
             options:NSKeyValueObservingOptionNew
             context:nil];

observationInfoオブザーバーとして登録した後のダンプは問題ないようです - 登録されているはずです。

ただし、私のobserveValueForKeyPath:ofObject:change:context:メソッドは呼び出されません。

関連する StackOverflow トピックを調べても、この問題の解決に近づくことはできませんでした。プロパティは、設定など
によって適切に設定されています。object.representedObject

ここで怪しげな何かの手がかり..? メソッドに登録するのは
悪い考えです..?selfinit

編集#1

そのセッターが呼び出されている合成されたものではなく、手動セッターを使用する場合。

4

2 に答える 2

1

観測がまったく呼び出されない場合、おそらく誰かが ivar に直接アクセスしているため、合成されたアクセサーが呼び出されていないことが最初に疑われますが、これはまさにこの理由で行うべきではありません。カスタム セッターを実装してみて (通常の代入を実行できます)、それが呼び出されていることを確認してください。


編集: 私の次のテストは、観察方法に正しく名前を付けたことを確認することです。これが Mac なのか iOS なのかはわかりません。Mac では、観察方法に誤った名前を付けても、アプリはクラッシュしませんでした。iOS では、たまたま別の場所 (スーパークラス、または実装の別の場所に実装) に実装していない限り、クラッシュします。

個人的には、おそらく最小限のテスト ケースを新しいプロジェクトに引き出して、単一のファイルで再現できるかどうかを確認します。あなたが終わったら、それはばかげたことになると確信しています。不適切な名前のメソッド。同じクラスの 2 つの異なるインスタンス (そして、間違ったインスタンスを見ています)。予期しない順序で実行されるメソッド。そんな感じ。

于 2012-12-09T21:22:33.113 に答える
-1

Apple のドキュメントKVO Observingkeywordで説明されているように、KVO を実現するには、ダイナミックを使用する必要があります。

于 2016-05-07T12:37:07.647 に答える