イベント ハンドラーとガベージ コレクション: 詳細
イベント ハンドラーがガベージ コレクションとどのように対話するかを理解することは、特定のプログラミング コンテキストにおいて非常に重要です。 イベント発行者とそのハンドラーの関係を調べてみましょう。
次のコード スニペットを考えてみましょう:
<code>MyClass pClass = new MyClass(); pClass.MyEvent += MyFunction; pClass = null;</code>
pClass
はガベージ コレクションされますか? 答えは「はい」です。イベントのサブスクリプション自体は、パブリッシャーのコレクションを妨げるものではありません。 ただし、詳細は MyFunction
が静的メソッドであるかインスタンス メソッドであるかによって異なります。
ハンドラーとしての静的メソッドとインスタンス メソッド
インスタンス メソッドを参照するデリゲートは、そのインスタンスへの参照を維持します。 これは、イベント サブスクリプションがガベージ コレクションを妨げる可能性があることを意味します。 ただし、イベント発行者 (pClass
) が収集の対象となると、この懸念は解消されます。
逆に、MyFunction
が静的である場合、デリゲートはインスタンス参照を保持しないため、ガベージ コレクションに障害は生じません。
オブジェクトの永続化の防止
インスタンスベースのイベント ハンドラーを使用すると、パブリッシャー (pClass
) がハンドラーのオブジェクトへの参照を保持することになります。 逆は当てはまりません。ハンドラーはパブリッシャーを存続させません。
したがって、ハンドラー オブジェクトをガベージ コレクションしたい場合は、イベントのサブスクライブを解除する必要はありません。 ただし、パブリッシャーの有効期間がハンドラーの有効期間を超える場合、ハンドラーの意図しない永続化を避けるためにサブスクライブを解除することが重要になります。
静的イベントとインスタンス ハンドラー: 注意事項
インスタンスベースのハンドラーで静的イベントを採用するには、慎重な検討が必要です。 静的デリゲートにインスタンス参照がないと、ハンドラー オブジェクトがメモリ内に無限に残り、メモリ リークが発生する可能性があります。
以上がイベント ハンドラーの種類はイベント パブリッシャーのガベージ コレクションに影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。