0
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 步中它被分配了空值。

Q1)步骤 4(分配给 null )是销毁实例的正确方法吗?

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

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

谢谢

4

2 回答 2

1

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

在上面的代码中,您不需要删除事件侦听器。当一个 SomeClass 实例被收集时,它的所有成员变量都将被收集(除非它们在别处被引用)。因为按钮已经添加了事件监听,所以在按钮被收集的时候会被收集。

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

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

于 2012-12-12T16:20:22.847 回答
1

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

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

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

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

于 2012-12-12T14:51:14.680 回答