2

私はActionScript 3の初心者です。最近、addEventListener関数を呼び出すために使用しようとしています。removeEventListener次のような関数を呼び出すときにa を追加する例がいくつかあることがわかりました。

public function Away3DMultiMarkerDemo()
    {
        addEventListener(Event.INIT, initIN2AR);
        super();
    }

    private function initIN2AR(e:Event = null):void
    {
        removeEventListener(Event.INIT, initIN2AR);

        in2arLib.init( workW, workH, maxPoints, maxReferences, 100, stage );
        in2arLib.setupIndexing(12, 10, true);
        in2arLib.setUseLSHDictionary(true);

        in2arLib.addReferenceObject( ByteArray( new DefinitionaData0 ) );
        in2arLib.addReferenceObject( ByteArray( new DefinitionaData1 ) );

        in2arLib.setMaxReferencesPerFrame(2);

        in2arLib.setMatchThreshold(40);

        intrinsic = in2arLib.getIntrinsicParams();

        initCamera();
        initAway3D();
        initText();
        initListeners();
    }

私の質問は、電話をかけるremoveEventListenerたびに を設定する必要があるaddEventListenerかということです。を追加する目的はremoveEventListenerメモリを解放することであるという調査を行いました。それ以外の場合、プログラムはリッスン イベントを保持します。

4

2 に答える 2

3

リスナーが不要になったら削除することをお勧めします。しかし、それはそれぞれの状況であなたがしなければならない呼び出しです。

デフォルトでイベントリスナーを追加すると、それが追加されたものの参照にハングアップします。そのため、リスナーをムービークリップに追加し、そのムービークリップを削除すると、イベント リスナーがまだ参照を持っているため、ガベージ コレクションは行われません。このため、削除プロセスの一環としてオブジェクトのリスナーを削除することをお勧めします。もちろん、addEventListenerメソッドで「弱い参照」引数を使用することもできるため、リスナーはガベージ コレクターがオブジェクトを破棄するのを防ぎません。

あなたの例のEvent.INITイベントの場合; これは 1 回だけ起動する必要があるため、イベント ハンドラーは、リスナーを確実に削除するのに最適な場所です。

于 2013-04-10T06:27:05.497 に答える
0

いいえ。イベントを1 回だけ実行する場合にのみ、これを行う必要があります。また、リスナーが不要になったときにも呼び出して、メモリを浪費しないようにします。

イベントが発生したときに呼び出される関数の最初のステートメントとしてこれを呼び出すと、リスナーが 1 回だけ呼び出されるようになります。

于 2013-04-10T01:50:25.323 に答える