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。或者会自动销毁?
由于
答案 0 :(得分:1)
1 /是。 (我假设someClass变量是一个实例变量)
2 / delete
不仅可以删除变量的值,还可以删除变量定义。由于AS3中的类通常是密封的,因此不起作用。即delete
只应用于动态创建的成员。主要是Object
或Dictionary
个实例的“键”。但显然您可以使用dynamic
删除标记为delete
的任何类的成员定义。
3 /是,始终手动删除事件侦听器。在将处理程序注册为侦听器时,您可以创建弱引用的事件侦听器,但最好始终确保手动删除事件侦听器,它更具可读性,清晰和故障安全。
我的所有类中都倾向于使用destroy
方法,实例所有者在清理对某个实例的引用时可以调用该方法。此destroy方法将取消注册所有事件侦听器,使实例成员无效并执行各种清理。
答案 1 :(得分:1)
您创建的SomeClass实例将在不再引用它之后进行垃圾收集。通过将您的变量设置为null,它将删除该引用,并且只要没有对它的引用,SomeClass实例就会被垃圾收集。
在上面的代码中,您不需要删除事件侦听器。收集SomeClass实例时,将收集其所有成员变量(除非它们在其他地方引用)。由于事件侦听器已添加到按钮,因此将在收集按钮时收集它。
需要注意的是:如果您使用myBtn.addEventListener
代替stage.addEventListener
,则舞台将保留对您的回调函数的引用,最终可能会导致内存泄漏。始终删除分配给在您关心侦听器后仍然存在的对象的事件侦听器。
Creynder的建议很好:根据习惯删除事件监听器。但是,当事件监听器的调度程序暂停,但您不希望回调留在内存中时,这是非常必要的。