ホームページ > バックエンド開発 > C++ > イベント ハンドラーはオブジェクトのガベージ コレクションを防止しますか?

イベント ハンドラーはオブジェクトのガベージ コレクションを防止しますか?

Patricia Arquette
リリース: 2025-01-26 23:51:12
オリジナル
665 人が閲覧しました

Will Event Handlers Prevent Garbage Collection of My Objects?

イベント ハンドラーはガベージ コレクションを妨げますか?

質問:

次のコードを考えてみましょう:

<code class="language-c#">MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass = null;</code>
ログイン後にコピー

pClass はガベージ コレクションされますか?それとも、それが持続してイベントをトリガーし続けるのでしょうか?次のようなイベントの登録を解除する必要がありますか:

<code class="language-c#">MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass.MyEvent -= MyFunction;
pClass = null;</code>
ログイン後にコピー

答え:

イベント発行者によるガベージコレクション:

MyEvent へのサブスクリプションは、pClass (パブリッシャー) のガベージ コレクションには影響しません。

ターゲットオブジェクトのガベージコレクション:

一般に、ガベージ コレクションの動作は、MyFunction がインスタンス メソッドであるか静的メソッドであるかによって異なります。

  • インスタンス メソッド: MyFunction を MyEvent にサブスクライブすると、MyClass への参照が含まれます。そのため、対象オブジェクトのガベージコレクションができなくなる可能性があります。ただし、発行者オブジェクトが収集の対象となると、この問題は解決します。
  • 静的メソッド: 静的イベントは、ターゲット オブジェクトのガベージ コレクションを妨げません。

その他の注意事項:

  • パブリッシャー (pClass など) の存続期間が長く、ターゲット オブジェクト (MyFunction を含むオブジェクトなど) よりも存続する場合、ターゲット オブジェクトをガベージ コレクションできるようにするためにサブスクライブを解除する必要があります。
  • 静的イベントは、ターゲット オブジェクトのガベージ コレクションを無期限に妨げる可能性があるため、インスタンス ベースのハンドラーと組み合わせて使用​​すると特に危険です。

以上がイベント ハンドラーはオブジェクトのガベージ コレクションを防止しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート