0
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 类添加了一个匿名 mouseclick 事件处理函数,而不是在将它从舞台上移除并清空时专门将其移除。

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

4

2 回答 2

1

虽然@sberry 的回答中的观点是完全正确的,但请仔细看看在这种情况下哪些对象相互引用。

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

主类具有对其实例化的按钮类的引用。

按钮类有一个对主类的引用,来自事件处理函数。

主类取消其对按钮的引用。

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

如果主类确实在应用程序的整个生命周期内都存在,那么就没有问题。如果主类以某种方式消失了,但按钮对象之一仍然存在,那么您就有内存泄漏(按钮维护对 main 的引用,并且 main 不能被垃圾收集)。

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

于 2012-06-14T16:14:47.613 回答
1

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

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

最后一个参数true,是为参数传递的useWeakReference。从文档

useWeakReference:Boolean (default = false) — 确定对侦听器的引用是强引用还是弱引用。强引用(默认)可防止您的侦听器被垃圾收集。弱引用不会。

于 2012-06-14T13:53:43.110 回答