0

アプリケーションを閉じると、メインコントローラークラスはそれ自体をオブザーバーとしてモデルから削除してから、モデルを解放します。このような:

- (void)dealloc {
    [theModel removeObserver:self
                  forKeyPath:@"myValue"];
    [theModel release];
    [super dealloc];
}

そしてその直後、デバッガーは次のように言います。

2010-04-29 14:07:40.294 MyProgram [13678:a0f]クラスTheModelのインスタンス0x116f2e880は、キー値オブザーバーがまだ登録されている間に割り当てが解除されました。観測情報が漏洩し、他の物体に誤って付着する可能性もあります。NSKVODeallocateBreakにブレークポイントを設定して、デバッガーでここで停止します。現在の監視情報は次のとおりです。
<NSKeyValueObservationInfo0x100288450>(
<NSKeyValueObservance 0x1002aca90:Observer:0x116f40ec0、Key path:myValue、Options:<New:YES、Old:NO、Prior:NO> Context:0x0、Property:0x116f80430>

ここで、0x116f2e880は実際にモデルであり、0x116f40ec0実際にはコントローラーです。

コントローラーがオブザーバーとして自分自身を削除したときに、コントローラーがオブザーバーになるにはどうすればよいですか?

4

1 に答える 1

2

これは単なる推測ですが、そのキーパスのオブザーバーとしてコントローラーを複数回追加しましたか?おそらく異なるオプションやコンテキストで?または、オブザーバーとして別のオブジェクトに追加しましたが、モデルオブジェクトに解決されるキーパスを使用しましたか?たとえば、fooにプロパティtheModelがあり、キーパス「theModel.myValue」を使用してコントローラーをオブザーバーとしてfooに追加した場合。

ブレークポイントを設定して-addObserver:forKeyPath:options:context:、何がいつ追加されるかを確認できますか?

于 2010-04-30T09:02:07.420 に答える