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

当您不再需要监听器时,最好删除它们。但这是您在每种情况下都必须做出的决定。

默认情况下添加一个事件监听器将挂在它被添加到的事物的引用上。所以如果你给一个movieclip添加一个监听器,然后删除那个movieclip,它就不会被垃圾回收,因为事件监听器仍然有它的引用。出于这个原因,最好在删除过程中删除对象上的所有侦听器。当然你也可以在addEventListener方法中使用“弱引用”参数,这样监听器就不会阻止垃圾收集器销毁对象。

对于Event.INIT您示例中的事件;这应该只触发一次,因此事件处理程序是确保您删除侦听器的理想场所。

于 2013-04-10T06:27:05.497 回答
0

不,如果您希望事件只执行一次,您只需执行此操作。当您不再需要侦听器时,您也会调用它,这样它就不会浪费内存。

如果您将它作为触发事件时调用的函数中的第一条语句调用,它将确保只调用一次侦听器。

于 2013-04-10T01:50:25.323 回答