イベントハンドラが少数しか登録されていないアプリケーションがあると(アプリケーションを閉じるまでイベントを使用しているオブジェクトが破棄されない)、本当にハンドラの登録を解除する必要がありますか?私が見ることができる唯一の良い理由は、イベントが発生したときに、必要以上に気にかけていない(つまり、1つのイベントに複数のハンドラを登録している)場合に少しオーバーヘッドが発生する可能性があるということです。その他の理由がありますか?彼らはイベントの登録を解除したので誰もが大きな問題に遭遇しましたか?あなたはA
イベントを公開し、B
はイベント(ハンドラ)に加入している場合イベントハンドラの登録を解除しないと悪いですか?
答えて
は、A
がB
より多く長生きしようとしている場合は解除しない唯一の問題です。基本的に、イベントサブスクリプションとは、A
がまだB
を見ることができるので、ガベージコレクションができないようにし、それを忘れてもイベントを発生させます(おそらくDisposed()
)。
たとえば、これが問題であるA
が静的なイベントであり、そしてB
が死んだ後にアプリをしばらく走る...
場合、1つが以下のように頼むかもしれない、注意することが重要です
もしBがAよりも長く生き残っているならば、BはAをガベージコレクトしないようにしますか?
そしてその答えは「いいえ」です。 Bはイベントを通じてAへの参照を持たない。 Aは通常通り収集されます
多くの人々は、出版社が加入者を失うことになるとイベントから退会することが重要であると考えているようです。私はそのアプローチを嫌いです。パブリッシャから切り離されないイベントサブスクライバは、パブリッシャとサブスクライバの外部のエンティティの動作にいくつかの厄介な依存関係を作成します。パブリッシャへの参照が予想より長く保持されていると、サブスクライバが参照を保持しているオブジェクトとともに、サブスクライバが有効になります。放棄されたオブジェクトの大部分がイベントハンドラによって相互接続されていて、いずれかのライブ参照が存在しない場合、すべてのオブジェクトはガベージコレクタによって掃除されます。しかし、誰かが予期せずにオブジェクトの1つへの参照を保持していると、そのオブジェクトがガベージコレクションされない可能性があります。
IMHO、イベントハンドラを削除することは、イベントハンドラを放棄するよりも予防的で、すべてがクリーンアップされることを期待する方がはるかに優れています。パブリッシャへの予期せぬ参照が存在しないことが確実である場合を除き、このようなアプローチは「主に」動作する可能性がありますが、時々メモリリークが発生します。
- 1. 登録解除
- 2. 静的メソッド(拡張メソッド)内の匿名イベントハンドラの登録解除
- 3. イベントからイベントハンドラを削除/登録解除するにはどうすればよいですか?
- 4. 登録解除BroadcastReceiver
- 5. 登録解除キャラクタデバイス
- 6. すべてのイベントハンドラを登録解除する必要がありますか?
- 7. デリゲートの新しいインスタンスでイベントの登録を解除する
- 8. Facebook登録プラグイン:登録ライフサイクル管理(登録解除)
- 9. WindowsセットアッププロジェクトでDLLを登録および登録解除する
- 10. Outlookの登録解除アプリ
- 11. Angular2:ホストリスナーの登録解除
- 12. asp:buttonイベントハンドラを登録する
- 13. std :: functionがコールバックとして登録解除可能ですか?
- 14. は、登録解除C2DM
- 15. CancellationToken登録解除アクション
- 16. Asp.Netのクライアントスクリプトを登録解除する
- 17. Python Twistedプロトコルの登録が解除されていますか?
- 18. COMをC#で登録解除
- 19. 他のMac Appで登録したホットキーの登録解除方法
- 20. TCL fileeventで登録されたコールバックの登録を解除するには?
- 21. ノックアウトで登録された機能の登録を解除するには?
- 22. DoubleClickのDataGridViewの登録解除
- 23. EventListeners自身の登録を解除しますか?
- 24. GAEによるユーザーの登録解除
- 25. ロケーショントラッキングを動的に制御する正しい方法(ロケーションブロードキャストレシーバーの登録/登録解除)
- 26. MySQLのサブクエリは悪いパフォーマンスを登録しよう
- 27. 解決していないタイプのUnity登録エラー
- 28. イベントハンドラをチェックする方法は登録されています
- 29. システムプロキシとして登録しないFiddlerCore
- 30. アクティビティに登録されているすべてのブロードキャスト受信者の登録を解除する
Bがリソースの重い場合は、特に悪いです... –
Marc。静的イベントのハンドラは、サブスクライバを廃棄するときに注意を払わなければ、本当に悪名高いものです。 – TheVillageIdiot
これは古い投稿ですが、読まれるかどうかわかりませんが、BがAよりも長く生きれば、BはAをガベージコレクションから守るでしょうか? @Scott。 –