1

iOS アプリの KVO に問題があります。私はそれを正しく理解できないようです。私がやろうとしていること:

グローバル値を監視 (および表示) する MenuViewController (Facebook アプリのように左側で表示可能) があります。いくつかの異なるアプローチを試みましたが、私のアプリは常にクラッシュします (さまざまな時点で、さまざまな理由で)。以下にそれらについて説明します。

注: [object addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil]MenuViewController をオブザーバーとして登録し、登録解除するために使用してい[object removeObserver:self forKeyPath:@"name" context:nil]ます。

シナリオ 1:

o-viewWillAppearメソッドにオブザーバーとして登録し、removeObserver コードを に入れました-viewWillDisappear。o 値が変更され、rootViewController が完全に変更されると、「割り当て解除されたインスタンスにメッセージが送信されました」というエラーが表示されます。したがって、MenuViewController はまだオブザーバーとして登録されていると思います。

シナリオ 2:

o その結果、removeObserverコードを dealloc 関数に入れました (後でそのaddObserver部分を viewDidLoad に移動しました) o 別のエラーが発生しました: キー パス "name" のオブザーバーを <...> から削除できないため、登録されていません。オブザーバーとして。

それで、誰かが私の問題とKVOを正しい方法で行う方法についてのヒントを教えてくれるかもしれません. 残念ながら、ドキュメントはこれまでのところ役に立ちませんでした。

ありがとう!

4

2 に答える 2

2

ビュー コントローラーは、割り当てが解除される前に常に viewWillDisappear を取得するとは限りません。あなたのテクニックは、あなたがすべきことに近いです。複数の viewDidLoad メッセージ (システムがビューをアンロードする場合) と viewWillAppear を取得できますが、dealloc は 1 つだけです。

今すべきことは、BOOL ivar、didObserve を使用することです。viewDidLoad で、didObserve == NO の場合、オブジェクトを観察し、フラグ didObserve=YES を設定してから、ログを追加します

NSLog(@"DID observe %@", object);

dealloc (または必要な他の場所) で、追加します。

if(didObserve) {
  unobserve
  NSLog(@"UNDID observe %@", object);
}

次にアプリを実行し、2 つのメッセージが表示されることを確認し、オブジェクトが毎回同じオブジェクトであること (nil ではないこと) を確認します。これは、整理するのに役立ちます。その変数への変更を記録する「observeValueForKeyPath:」にログを記録することもできます。

于 2012-08-21T13:09:56.057 に答える
0

あなたの例の「オブジェクト」とは何ですか? これが問題の原因である可能性があります (たとえば、割り当てが解除された)。

于 2012-08-21T12:26:29.773 に答える