あなたの1000のムービークリップには、あなたのonClick機能への参照があります。その逆ではありません。 あなたの質問に答えると、1000曲のムービークリップがGCedになるかどうかです。
一方、あなたのムービークリップのonClick関数への参照は、それが生きている(およびそれが属するかもしれない)オブジェクトを生かしています。これらのMCに他の参照情報があれば、それらを生き続けることができます。
次のコード:それはどんな強い参照を持っていないよう
mc.addEventListener(MouseEvent.CLICK , function(ev:Event):void{ trace("I am only a poor anonymous function"); }, false, 0, true);
は、かなりすぐにあなたのリスナー関数GCedを持つことになります。あなたがあなたのステージに
stage.addEventListener(MouseEvent.CLICK, someObjectBelowIntheDisplayList.listenerFunction);
をイベントリスナーを追加する場合は、trueにただし、useWeakReferenceを設定
はかなり関連する可能性がある上記のコードは、それが他の参照を持っていない場合でも、生きているあなたのリスナー関数でオブジェクトを維持します。
someObjectBelowIntheDisplayList.addEventListener(MouseEvent.CLICK, stage.onClick)
上記のコードは、生きているあなたのsomeObjectBelowIntheDisplayListを保持しません。これは、ステージへの参照を持っていますが、ステージがsomeObjectBelowIntheDisplayListへの参照を取得していない
編集:このコードは明らかに私が言っているものをサポートしてい
import flash.display.MovieClip;
import flash.events.Event;
var mc:MovieClip ; //<<<<<<< OUTSIDE LOOP
function enterframe(ev:Event):void
{
for (var i=0 ; i< 1000 ; i++)
{
mc = new MovieClip() ;
mc.onClick = function(ev:Event){};
// Use one of the following lines, comment out the other one
//mc.addEventListener(MouseEvent.CLICK , onClick) ; // no memory leak
stage.addEventListener(MouseEvent.CLICK, mc.onClick); // memory will rise up and up
}
}
this.addEventListener(Event.ENTER_FRAME, enterframe);
function onClick(ev:Event):void
{
}
:MCを使用して、次のコードを試してみてください.addEventListenerはではありません。はメモリを消費します。それは私のシステムで約20MBのままです。 リスナー関数としてstage.addEventListenerを使用し、mc.onClickを使用すると、フレームごとにメモリ消費量が増加します。
1000個のムービークリップをクリック可能にする必要があるため、この時点ではメモリリークが発生しません。ムービークリップでやったことがあり、イベントリスナーの問題が再生されるようにそれらをメモリから削除したいときだけです。 Ascentionの答えは正しいが、「would」という言葉が重要である。 – crooksy88
ここに誰もが訂正します。私は決してAdobeのドキュメンテーションを再び信用しません。私の更新された答えを見てください。私の現在の答えは間違っています。 –