手動で呼び出す必要があります-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 にブレークポイントを設定して、デバッガーでここで停止します。現在の観測情報は次のとおりです。
デバッグすると、次のことがわかります。self
とa
はリークしていません。漏れているのは、NSKeyValueObservationInfo object
あなたが電話しない場合-removeObserver:forKeyPath:
。2) 中間クラスは && Infinity 通知を破棄しません
KVOに関するAppleのドキュメントには次のように書かれています:
オブザーバーがオブジェクトの属性に登録されると、監視対象オブジェクトの isa ポインターが変更され、真のクラスではなく中間クラスを指します。
オブザーバーを削除すると、オブザーバーが登録されていない場合、中間クラスが破棄されます。また、removeObserver を呼び出さない場合、中間クラスは破棄されず、プロパティを変更すると、中間クラスのセッター メソッドは通知を送信し続けます。