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

时间:2012-12-12 13:29:26

标签: actionscript-3

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

       function clickFunction(e:Event){

        }

    }

}

主类:

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

在上面,我想完全销毁someClass实例,所以在步骤4中它被赋予了null值。

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

Q2)我提到:http://gskinner.com/blog/archives/2006/06/as3_resource_ma.html使用对象的delete关键字。但我不认为删除关键字可用于类实例?那么如何在这种情况下使用呢?

Q3)SomeClass中的myBtn eventListener会发生什么。我应该在销毁SomeClass的实例之前手动添加removeEventListener。或者会自动销毁?

由于

2 个答案:

答案 0 :(得分:1)

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

2 / delete不仅可以删除变量的值,还可以删除变量定义。由于AS3中的类通常是密封的,因此不起作用。即delete只应用于动态创建的成员。主要是ObjectDictionary个实例的“键”。但显然您可以使用dynamic删除标记为delete的任何类的成员定义。

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

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

答案 1 :(得分:1)

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

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

需要注意的是:如果您使用myBtn.addEventListener代替stage.addEventListener,则舞台将保留对您的回调函数的引用,最终可能会导致内存泄漏。始终删除分配给在您关心侦听器后仍然存在的对象的事件侦听器。

Creynder的建议很好:根据习惯删除事件监听器。但是,当事件监听器的调度程序暂停,但您不希望回调留在内存中时,这是非常必要的。