Flash 我应该在删除自定义对象之前删除侦听器吗?

Flash 我应该在删除自定义对象之前删除侦听器吗?,flash,actionscript-3,Flash,Actionscript 3,我(通过addChild)将库对象(扩展movieclip类的MyObject类的movieclip)加载到空的movieclip中。在某种程度上,我从主目录中将这个自定义movieclip从其父目录中删除,并将任何引用设置为null以完全销毁它。问题是:如果自定义movieclip类中有EventListener会怎么样?我销毁该对象时是否删除了它们?我是否应该在删除对象之前编写一个方法来删除它们?理想情况下,如果您试图为了垃圾收集目的销毁对象,则应该清除对象中的所有内部引用。您还可以创建具有

我(通过addChild)将库对象(扩展movieclip类的MyObject类的movieclip)加载到空的movieclip中。在某种程度上,我从主目录中将这个自定义movieclip从其父目录中删除,并将任何引用设置为null以完全销毁它。问题是:如果自定义movieclip类中有EventListener会怎么样?我销毁该对象时是否删除了它们?我是否应该在删除对象之前编写一个方法来删除它们?

理想情况下,如果您试图为了垃圾收集目的销毁对象,则应该清除对象中的所有内部引用。您还可以创建具有弱引用的侦听器,通过将第五个参数作为
true
传递,使其自动销毁,但我个人建议不要使用弱引用,并养成手动正确清理的习惯

//setting a weak referenced listener
foo.addEventListener(Event.WHATEVER,bar(),false,0,true);

您必须删除所有事件侦听器(或者如果您很懒,请在添加事件侦听器时使用弱引用),否则仍然会有对对象的内部引用阻止垃圾收集器对其进行收集。

我几乎在我编写的每个类中都包含某种类型的
destroy()
方法。此方法负责该类中任何子对象的所有实例或引用。这包括任何监听器、显示列表引用等。然后,在我删除/取消父级之前,我调用其
destroy()
方法以确保正确的GC并避免内存泄漏。请注意,如果需要,这可以向下链接嵌套较深的对象

您可以只使用弱引用并删除整个对象。ASVM2通常足够聪明,可以正确地杀死子对象,但这充其量是糟糕的GC管理,而且您只是要求内存泄漏


我的0.02美元。

如果我问这是因为我不懒惰(不完全);-)有没有办法从自定义对象内部获取对所创建的任何侦听器的引用?目标是最终从循环中删除它们。可能吗?不可能,因为您可能正在将侦听器注册到不同的对象上,并且
addEventListener
不返回任何内容,因此无法存储引用。如果要同时注册所有侦听器,我发现最好的方法是使用名为
addListeners
removellisteners
的函数,这使维护更容易,但如果在执行过程中以不同的间隔添加侦听器,则没有多大用处。非常奇怪,当我试图一次删除所有侦听器时,我得到了一个错误#1009。忘记我说的,这是一个完全无关的问题。很抱歉