0
public class MyButton extends Sprite 
{     
   public function MyButton(defaultHandler:Function)     
   {     
      addEventListener(MouseEvent.CLICK, defaultHandler);     
   } 
}

//メインクラス

var myButton:MyButton =new MyButton(someFunction);
addChild(myButton)

removeChild(myButton);
myButton = null;

IE 匿名の mouseclick イベント ハンドラー関数を、作成時に Button クラスに内部から追加しています。ステージから削除されて無効になったときに特に削除するわけではありません。

このオブジェクトはガベージ コレクターの対象となるでしょうか? これによりメモリ リークが発生するのではないでしょうか? または、イベント リスナーは、それ自体が削除されたオブジェクトのみを参照していたため、それも削除されますか?

4

2 に答える 2

1

@sberryの回答のポイントは完全に有効ですが、このシナリオでどのオブジェクトが相互に参照しているのかを詳しく見てください。

メインクラスがアプリケーションの存続期間中存在する場合、メモリリークはありません

メインクラスには、インスタンス化されたボタンクラスへの参照があります。

Buttonクラスには、イベント処理関数からのメインクラスへの参照があります。

メインクラスは、ボタンへの参照を無効にします。

この時点で、ボタンへの参照はもうありません。ボタンはガベージコレクションできます。

メインクラスがアプリの存続期間中本当に存在する場合、問題はありません。どういうわけかメインクラスがなくなっても、ボタンオブジェクトの1つが残っている場合は、メモリリークが発生しています(ボタンはメインへの参照を維持し、メインはガベージコレクションできません)。

PS:弱い参照を使用しているとき、または使用しているときにイベントリスナーを削除することに反対しているわけではありません。可能な限り、両方のプラクティスを自分で行います:)

于 2012-06-14T16:14:47.613 に答える
1

インスタンスのイベント リスナーはButton、特にリスナーを削除するか、リスナーが弱参照になることを通知しない限り、ガベージ コレクションを防ぎます。

addEventListener(MouseEvent.CLICK, defaultHandler, false, 0, true);

最後の引数trueは、パラメータに渡されますuseWeakReferenceドキュメントから:

useWeakReference:Boolean (デフォルト = false) — リスナーへの参照が強いか弱いかを決定します。強い参照 (デフォルト) は、リスナーがガベージ コレクションされるのを防ぎます。弱い参照はそうではありません。

于 2012-06-14T13:53:43.110 に答える