6

KVO に関するアップルのドキュメントを読んだところ、次のように書かれていました。

注: キー値監視 addObserver:forKeyPath:options:context: メソッドは、監視オブジェクト、監視オブジェクト、またはコンテキストへの強い参照を維持しません。必要に応じて、観察対象、観察対象、およびコンテキストへの強力な参照を維持する必要があります。

オブザーバー オブジェクトは、オブザーバー オブジェクトへの強い参照を持っていません。

removeObserver:forKeyPath:この男はdeallocメソッドで呼び出すことができませんか? オブザーバーを自動的に削除できますか?

4

4 に答える 4

11

手動で呼び出す必要があります-removeObserver:forKeyPath:。iOSは自動的にそれを行いません。

アップルは言っdoes not maintain strong references to the observing objectた。一時変数の範囲外の一時変数のObserverを削除する場合は、一時変数をivarとして作成する必要があるため、ivarの強い参照を維持する必要があります。

あなたが電話しない場合-removeObserver:forKeyPath:。1) 何かが漏れる

次のようにコーディングします。

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

あなたが電話しない場合-removeObserver:forKeyPath:。それはそれを慰めます:

An instance 0x756a1d0 of class MyClass was deallocated while key value observers were still registered with it. Observation info was

漏れて、誤って他の物に付着することさえあります。NSKVODeallocateBreak にブレークポイントを設定して、デバッガーでここで停止します。現在の観測情報は次のとおりです。

デバッグすると、次のことがわかります。selfaはリークしていません。漏れているのは、NSKeyValueObservationInfo object

あなたが電話しない場合-removeObserver:forKeyPath:。2) 中間クラスは && Infinity 通知を破棄しません

KVOに関するAppleのドキュメントには次のように書かれています:

オブザーバーがオブジェクトの属性に登録されると、監視対象オブジェクトの isa ポインターが変更され、真のクラスではなく中間クラスを指します。

オブザーバーを削除すると、オブザーバーが登録されていない場合、中間クラスが破棄されます。また、removeObserver を呼び出さない場合、中間クラスは破棄されず、プロパティを変更すると、中間クラスのセッター メソッドは通知を送信し続けます。

于 2013-10-23T07:12:31.133 に答える
2

removeObserver:forKeyPath:メモリ管理や参照の維持とは関係ありません。そのキーパスでのオブジェクトへの変更をオブジェクトに通知する必要がなくなったことをランタイムに伝えるだけです。

于 2013-10-22T09:54:46.583 に答える
1

いいえ、必要-removerObserver:forKeyPath:がなくなったときに呼び出す必要があります。そうしないと、KVO システムにダングリング ポインターがいくつか存在し、それがリークしたり、予期しない別のオブジェクトにアタッチされたりする可能性があります。

于 2013-10-22T09:52:57.817 に答える
1

いいえ、あなたはそれを呼び出す必要があります。

強くない 常に弱いとは限らない

ただし、この場合は unsafe_unretained を意味します。

オブザーバーを削除しないと、次のエラー メッセージが表示されます。

そして、クラッシュする可能性があります

于 2013-10-22T09:54:24.733 に答える