イベント ハンドラーとガベージ コレクション
イベント ハンドラーは、アプリケーションがさまざまなイベントに応答できるようにする上で重要な役割を果たします。ただし、よくある誤解は、イベント ハンドラーによってオブジェクトのガベージ コレクションが妨げられるということです。
ガベージ コレクションとイベント ハンドラー
提供されたコード スニペット内:
<code>MyClass pClass = new MyClass(); pClass.MyEvent += MyFunction; pClass = null;</code>
イベント サブスクライバ MyEvent は MyFunction メソッドに割り当てられます。 pClass に null の値が割り当てられると、pClass がすぐにガベージ コレクションされるのか、それともまだ存在してイベントがトリガーされるのかという疑問が生じます。
答え: イベント サブスクライバーはパブリッシャーのガベージ コレクションに影響しません
pClass がガベージ コレクションされるかどうかという具体的な質問に対する答えは「はい」です。イベント サブスクリプションは、公開されたオブジェクト (pClass) のガベージ コレクションを妨げません。
ただし、ターゲット オブジェクト (イベントを処理するオブジェクト) のガベージ コレクションは、MyFunction メソッドが静的かインスタンスベースかによって異なることに注意することが重要です。
静的イベントハンドラー
MyFunction が静的である場合、インスタンスへの参照は保持されません。したがって、静的メソッドを使用してイベントをサブスクライブしても、ターゲット オブジェクトがガベージ コレクションされるのを防ぐことはできません。
インスタンスベースのイベント ハンドラー
MyFunction がインスタンス メソッドの場合、デリゲートにはインスタンスへの参照が含まれます。これは、インスタンスベースのメソッドを使用してイベントをサブスクライブすると、ターゲット オブジェクトがガベージ コレクションされるのを防ぐことができることを意味します。ただし、公開されたオブジェクト (この場合は pClass) が収集の対象となると、この問題はなくなります。
注: イベント サブスクライバーとガベージ コレクションの間の関係は一方向です。 pClass がインスタンスベースのメソッドによって処理されるイベントをサブスクライブする場合、pClass はターゲット オブジェクトを存続させます。ただし、pClass が発行したイベントをサブスクライブする場合、pClass はターゲット オブジェクトを存続させません。
存続期間の長いオブジェクトのガベージ コレクションのサブスクライブを解除します
pClass の存続期間が長く、そのメモリが MyFunction を持つインスタンスよりも長く存在する場合、ターゲット インスタンスがガベージ コレクションされなくなる可能性があります。この場合、処理後にイベントのサブスクライブを解除して、ターゲット オブジェクトを収集できるようにする必要があります。
したがって、イベント ハンドラーは、公開されたオブジェクトのガベージ コレクションを妨げません。ただし、イベント ハンドラーのタイプ (静的またはインスタンス ベース) と、サブスクリプション オブジェクトの有効期間が長いかどうかを考慮する必要があります。
以上がイベント ハンドラーは発行オブジェクトのガベージ コレクションを防止しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。