Actionscript 3 想澄清一些关于垃圾收集的疑问(AS3.0)

Actionscript 3 想澄清一些关于垃圾收集的疑问(AS3.0),actionscript-3,Actionscript 3,主要类别: package { public class SomeClass { public var myBtn:Button ; public function SomeClass() { myBtn.addEventListener( MouseEvent.CLICK, clickFunction) ; } function clickFunction(e:Event){

主要类别:

package
{
     public class SomeClass
     {
       public var myBtn:Button ; 
       public function SomeClass()
       { 
         myBtn.addEventListener( MouseEvent.CLICK, clickFunction) ;
       }

       function clickFunction(e:Event){

        }

    }

}
在上面,我想完全销毁someClass实例,因此在步骤4中,它被赋值为空值

Q1)步骤4(赋值为null)是否是销毁实例的正确方法

问题2)我提到:对对象使用delete关键字。但我不认为delete关键字可以用于类实例?那么在这种情况下如何使用它呢

问题3)在某个类中myBtn eventListener会发生什么情况。在销毁某个类的实例之前,是否应该手动添加removeEventListener。还是会自动销毁

谢谢

1/是的。(我假设someClass变量是一个实例变量)

2/
delete
不仅删除变量的值,甚至删除变量定义。因为AS3中的类通常是密封的,所以它不起作用。也就是说,
delete
只能用于动态创建的成员。主要是
对象
字典
实例的“键”。但是显然,您可以使用
delete
删除标记为
dynamic
的任何类的成员定义

3/是,始终手动删除事件侦听器。在将处理程序注册为侦听器时,可以创建弱引用的事件侦听器,但最好始终确保手动删除事件侦听器,这样更可读、更清晰且故障安全


我的所有类中都倾向于使用
destroy
方法,实例所有者在清理对某个实例的引用时可以调用该方法。此destroy方法将注销所有事件侦听器、清空实例成员并执行各种清理。

您创建的SomeClass实例将在不再有任何引用后被垃圾回收。通过将变量设置为null,它将删除该引用,并且只要没有更多引用,SomeClass实例就会被垃圾收集

在上面的代码中,不需要删除事件侦听器。收集SomeClass实例时,将收集其所有成员变量(除非它们在别处引用)。由于事件侦听器已添加到按钮,因此将在收集按钮时收集它

但是需要注意的是:如果您使用了
stage.addEventListener
,而不是
myBtn.addEventListener
,那么stage将保留对回调函数的引用,并且最终可能导致内存泄漏。始终删除分配给对象的事件侦听器,这些对象在您关心侦听器之后仍然存在

Creynder的建议很好:习惯性地删除事件侦听器。但是,只有当事件侦听器的调度程序将挂起,但您不希望回调留在内存中时,才真正需要它

 var someClass:SomeClass = new SomeClass(); // step 1 
 addChild(someClass); // step 2 
 removeChild(someClass); // step 3 
 someClass = null  // step 4