2013-04-10 33 views
2

我是ActionScript 3的初学者。最近我尝试使用addEventListener来调用函数。我发现有一些例子添加removeEventListener当它们调用的功能,如:当我调用addEventListener时,是否必须设置removeEventListener?

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的目的是为了释放内存,否则程序会保持监听事件。

回答

0

不,您只需要执行此操作即可,只需要执行一次。当你不再需要听众时,你也可以调用它,这样它就不会浪费记忆。

如果您将其称为触发事件时调用的函数中的第一个语句,它将确保只监听一次。

3

当您不再需要听众时,最好将其删除。但是这是你必须在每种情况下做出的呼叫。

默认情况下添加一个事件侦听器将挂在它添加到的东西的引用上。因此,如果将侦听器添加到动画片段并删除该动画片段,它将不会被垃圾收集,因为事件侦听器仍然会引用它。出于这个原因,删除过程中删除对象上的任何侦听器都是很好的做法。当然你也可以在addEventListener方法中使用“弱引用”参数,这样监听器就不会让垃圾收集器破坏对象。

在您的示例中Event.INIT事件的情况下;这应该只会触发一次,所以事件处理程序是确保您删除侦听器的理想场所。

+0

只需添加一个弱引用监听器看起来像(最后一个参数是useWeakReference的布尔值):addEventListener(Event.INIT,initIN2AR,false,0,true); – crooksy88 2013-04-10 06:59:29

+0

谢谢你的回复,你能不能详细解释一下“弱引用”?弱引用的目的是什么?这些参数是什么(false,0,true)意味着什么。如果我设置了一个弱引用,那我还需要一个removeEventListener吗? – Richard 2013-04-10 14:40:04

+0

@Richard我认为格兰特斯金纳可以做比我更好的工作来解释事件监听者的弱引用。请阅读这里:http://gskinner.com/blog/archives/2006/07/as3_weakly_refe.html – 2013-04-11 05:31:37

相关问题