2011-08-18 92 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