0

一般的な知恵として、ステージからコンポーネントを削除するときは、すべての子も手動で削除して、メモリ内でフローティングしないようにする必要があります。親コンテナが削除されたため、それらはまったく表示されないためです。

この例は、Label内のコンポーネントBorderContainerです。私の理解では、Label最初に を削除してからBorderContainer.

デフォルトスキンなどのコンポーネントを作成すると、タイトルバー/ヘッダーに がTitleWindow追加されます。closeButton

閉じるボタンにイベントリスナーを追加しました。TitleWindow.closeButton.addEventListener();閉じるボタンイベントによって呼び出される関数で、ウィンドウを閉じたり削除したりしたい。

私の質問はこれです。closeButtonの子としてを手動で削除する必要がありTitleWindowますか? または、リスナーを削除TitleWindowしてステージから削除すると、スキンによって作成されたコンポーネントが自動的に削除/ガベージ コレクションされますか?

4

2 に答える 2

2

コンポーネントがステージから削除されると、すべてのイベント リスナーを削除している限り、そのすべての子が自動的に削除され、ガベージ コレクションが行われます。したがって、子をガベージ コレクションするために明示的に削除する必要はありません。

しかし、あなたの質問ではスキンについて言及しています。スキンが使用される場合、ホスト コンポーネントのskinDestructionPolicyプロパティは常に に設定されますnever(ただし、1 つのモバイル クラスを除きます。どのクラスか忘れてしまいました)。これは、スキンとそのすべての子が永久にメモリに残り、ガベージ コレクションが行われないことを意味します。

このデフォルト設定を上書きするのは簡単ではありません。この質問と私がそこに書いた答えを読んで、それがどのように行われるかを確認してください: Spark SkinnableComponent skinDestructionPolicy

99% のケースで、このデフォルトの動作は実際には問題ではないことに注意してください。もちろん、私はあなたの特定の状況を知らないので、それ以上コメントすることはできません.

于 2012-06-26T21:27:18.763 に答える
1

私が学んだ常識はあなたのものとは異なります。ステージから何かを取り除くとき。定義上、すべての子はステージ上にいません。メイン コンポーネントまたは子コンポーネントへの参照が残っていないと仮定すると、それらはすべてガベージ コレクションの対象となるはずです。

ここで、イベント リスナーを TitleWindow の閉じるボタンに追加すると、その TitleWindow をステージから削除することでガベージ コレクション用のコンポーネントが解放されるかどうかは、リスナーの保持者によって異なります。

TitleWindow がリスナーを保持している場合、TitleWindow はステージ上にないため、TitleWindow とそのすべての子の両方がガベージ コレクションの対象となります。

メイン アプリケーション、またはまだステージ上にあるコンポーネントがイベント リスナーを保持している場合、コンポーネントまたはその子がガベージ コレクションの対象になる前に、そのイベント リスナーを削除する必要があります。

于 2012-06-26T21:28:47.857 に答える