私は(addObserverを使用して:...)別のオブジェクトバーからKVO通知を受信するオブジェクトFOOを登録した私は、FOOを解放した場合、私はバーにremoveObserver:forKeyPath:
メッセージを送信する必要があります-deallocで?Cocoaでは、オブジェクトの割り当てを解除するときに、KVO通知を受け取るオブジェクトを削除する必要がありますか?
答えて
-[NSObject dealloc]
が実行される前に、オブザーバを削除する必要があります。そうすれば、クラスの-dealloc
メソッドで実行することができます。
それよりも優れていますが、観測を行っているオブジェクトを所有しているものは、それが完了したことを示すことができ、(最終的に)割り当てを解除されるという決定論的な点があるでしょう。そうすることで、実際に割り当てを解除した時点に関係なく、観測を行うことがもう必要なくなったときにすぐに観察を停止することができます。
これは、ココアのオブジェクトの存続期間が、それがあると思われるように決定的ではないため、留意することが重要です。さまざまなMac OS Xのフレームワーク自体は、あなたのオブジェクト-retain
と-autorelease
を送り、そうでないと思われるかもしれない寿命を延ばします。
さらに、Objective-Cガベージコレクションに移行すると、-finalize
は非常に異なる時刻に(非常に異なるコンテキストで)、-dealloc
よりも実行されることがわかります。一つは、ファイナライズは別のスレッドで行われるので、実際にはできません-removeObserver:forKeyPath:
を別のオブジェクトに-finalize
メソッドで安全に送信できません。 -dealloc
と-finalize
におけるメモリ(および他の希少資源)へ
スティック管理、および所有者は、あなたが、確定時点でそれで行われているオブジェクトを伝える持っている別の-invalidate
メソッドを使用します。 KVOの観測結果を削除するようなことをしてください。コードの意図が明確になり、微妙なバグが少なくなります。
私は苦しい経験から得た追加情報:ガベージコレクションの実行中にNSNotificationCenterが弱参照をゼロにしていますが、KVOはそうではありません。したがって、GCを使用しているときにNSNotificationCenterオブザーバを削除しなくても済むようにすることができます(ただし、retain/releaseを使用する場合は、オブザーバを削除する必要があります)が、KVOオブザーバは削除する必要があります。
これはどこかに書かれていますか? – hpique
Chrisは、「メモリとその他の乏しいリソースに管理してください。」という-deallocと-finalizeの管理に関するコメントにはっきりと同意します。何度も、dealloc関数でNSTimerオブジェクトを無効にしようとする人がいます。問題は、NSTimerがターゲットを保持していることです。したがって、NSTimerのターゲットが自己であれば、deallocは呼び出されることはありません。その結果、メモリリークが発生する可能性があります。
-invalidate
での無効化と私は経験から、あなたのオブザーバーを削除しない場合は、無限のクラッシュに届きます痛みを確認することができ、あなたのdealloc
とfinalize.
- 1. gcnewに割り当てられたオブジェクトでは、いつ削除する必要がありますか?
- 2. C++メモリの割り当てを解除する必要がありますか?
- 3. 削除後にポインタ0を割り当てる必要がありますか?
- 4. ARCがオブジェクトを割り当て解除するのはなぜですか?
- 5. いつNSUserNotificationCenterの通知を削除する必要がありますか?
- 6. オブジェクトの配列(オブジェクトのダイナミックメモリ割り当て)からオブジェクトを削除(メモリ解放)するには
- 7. UIApplicationDelegateが所有するオブジェクトの割り当てを解除する利点はありますか?
- 8. 他のオブジェクトを参照に割り当てる前にインスタンスオブジェクトを解放する必要はありますか?
- 9. ネイティブfirebaseを削除する通知をまだ受け取ります
- 10. オブジェクトをC++で直接割り当て解除します
- 11. オブジェクトが孤立する前にオブジェクトからイベントサブスクリプションを削除する必要はありますか?
- 12. 移動コンストラクタとスマートポインタの移動割り当てを削除する必要がありますか?
- 13. 新しいオブジェクトを挿入する前にリストからオブジェクトを削除する必要がありますか?
- 14. パラメータを渡すときに作成されるオブジェクトは削除する必要がありますか?
- 15. オブジェクトが不思議に割り当て解除される
- 16. オブジェクトからプロパティを削除し、それをコンストラクタのプロパティに割り当てることはできますか?
- 17. C#Windows 7でアプリケーションを削除するときに通知を受け取ります
- 18. iOS:オブジェクトをプロパティリスナーとして追加するとき、オブジェクトを解放する前にリスナーを「登録解除」する必要がありますか?
- 19. C 'がローカルスタック変数を割り当て解除するとき?
- 20. いつオブザーバーを削除すればよいですか?オブザーバを削除する前にオブジェクトの割り当てを解除する際のエラー
- 21. 割り当て/割り当て解除を追跡できますか?
- 22. レルムデータベース - オブジェクトを削除するときの通知
- 23. オブジェクトの割り当てが解除されます - なぜですか?どこ?
- 24. Javaメモリプロファイリングが異常なオブジェクト割り当てと割り当て解除を示します
- 25. 要素を削除する前にjqueryイベントのバインドを解除する必要がありますか?
- 26. バッジを削除しますが、すべての通知を削除する方法はありますか?
- 27. オブジェクトが破壊されたときにオブザーバを削除する必要がありますか?
- 28. GLSurfaceViewでテクスチャを削除する必要がありますか?
- 29. 大きなファイルを削除する必要があります
- 30. オブジェクトが実際に割り当てられたことを確認する必要がありますか?
に他のメモリクリーンアップを行います。 – Jeff
その徹底的な説明をありがとう! OS X 10.7ライオンのよう –
は、-removeObserver 'もあります:forKeyPathは:コンテキスト:'、あなたが-addObserver 'に渡された同じコンテキストに渡すことができます:forKeyPath:オプション:コンテキスト:'。ユニークなコンテキストを渡すことで、あなたがあなたを削除したときに他人の観察を削除しないようにします。 –