2011-08-18 62 views
0

我將此模塊的一個實例添加到顯示列表中,然後將其刪除。 foo附加的事件監聽器是否會產生泄漏? 簡化模塊:關閉模塊之前刪除事件偵聽器

<s:Module creationComplete="init()"> 
    <fx:Script> 
     protected var foo:Bar = new Bar(); 
     protected function init() { 
      foo.addEventListener(MouseEvent.CLICK, foo_clickHandler); 
     } 

     protected function foo_clickHandler(event:MouseEvent):void { 
      //do something 
     } 
    </fx:Script> 
</s:Module> 

回答

1

此模塊沒有內存泄漏因爲你添加監聽到本地的對象,而不是一個StageStyleManager或其他一些全球可訪問的東西。

+0

我發現這個[presentation](http://blogs.adobe.com/aharui/GarbageCollection/GCAtomic.ppt)非常有幫助。看起來內存泄漏是由於將偵聽器添加到對象樹頂部的「特殊」對象引起的,這些對象樹始終會被引用,並且永遠不會被垃圾收集。 – hidarikani

0

它會的。您應該刪除偵聽器,或者在創建偵聽器時使用弱引用。

foo.addEventListener(MouseEvent.CLICK, foo_clickHandler, false, 0, true); 
+0

什麼時候刪除活動?我應該聽哪個活動?也許removedFromStage?這種內存泄漏的東西是相當混亂的:/ – hidarikani

+0

最簡單的解決方案是使用弱引用,這樣只要應用程序中的其他內容具有句柄,它就不會被垃圾收集。刪除它的更明確的方法是使用removed或removedFromStage事件。 – SuperSaiyen