2013-04-10 320 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

相關問題