AS3:这会导致内存泄漏吗?

时间:2012-06-14 13:45:19

标签: actionscript-3 memory garbage-collection

public class MyButton extends Sprite 
{     
   public function MyButton(defaultHandler:Function)     
   {     
      addEventListener(MouseEvent.CLICK, defaultHandler);     
   } 
}

//主要课程

var myButton:MyButton =new MyButton(someFunction);
addChild(myButton)

removeChild(myButton);
myButton = null;

IE我在构建时将内部的匿名鼠标点击事件处理函数添加到我的Button类中,而不是在从舞台中删除它时将其删除并将其删除。

此对象是否有资格使用垃圾收集器,这不会导致内存泄漏吗?或者因为事件监听器只引用一个本身被删除的对象,它也会被删除???

2 个答案:

答案 0 :(得分:1)

Button实例上的事件侦听器将阻止它被垃圾回收,除非您专门删除侦听器,或者表示侦听器将是弱引用。

addEventListener(MouseEvent.CLICK, defaultHandler, false, 0, true);

为参数true传递最后一个参数useWeakReference。来自docs

  

useWeakReference:Boolean(default = false) - 确定是否   对听众的引用很强或很弱。一个强有力的参考(   默认值)防止您的侦听器被垃圾收集。弱者   参考没有。

答案 1 :(得分:1)

虽然@ sberry的答案中的要点完全有效,但请仔细查看在这种情况下哪些对象相互引用。

如果主要类在应用程序的生命周期内存在,没有内存泄漏

Main class引用了它实例化的按钮类。

Button类具有对主类的引用,来自事件处理函数。

Main class将对该按钮的引用置空。

此时,不再有对按钮的引用。按钮可以并将被垃圾收集。

如果主要类在应用程序的生命周期中真正存在,则没有问题。如果某个主类消失,但其中一个按钮对象仍然存在然后你有内存泄漏(该按钮维护对main的引用,而main不能被垃圾回收)。

PS:我不反对在使用弱引用时删除事件侦听器,我尽可能自己做这两种做法:)