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类中,而不是在从舞台中删除它时将其删除并将其删除。
此对象是否有资格使用垃圾收集器,这不会导致内存泄漏吗?或者因为事件监听器只引用一个本身被删除的对象,它也会被删除???
答案 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:我不反对在使用弱引用时删除事件侦听器,我尽可能自己做这两种做法:)