我有一个关于as3内存管理的问题。
例如,如果我有课
public class CustomizationScreen extends MovieClip {
private var a:Display;
public var b:Buttons;
public function CustomizationScreen() {
a = new Display(200,-20);
b = new Buttons(900,-100,"Next");
addChild(a);
addChild(b);
}
}我在主类中实例化了这个类
public class Main extends MovieClip {
public var c:CustomizationScreen;
public function Main() {
c = new CustomizationScreen(200,-20);
c.b.addEventListener(Event,func);
addChild(c);
}
// func
}这是否足以让c对象被垃圾收集?
c.removeEventListener(Event,func);
removeChild(c);
c=null;还是也需要从c中移除a和b对象?
发布于 2016-11-01 23:43:24
正如您应该知道的,垃圾收集不是一个及时的过程,在分配有价值的内存之前是不会完成的。
但是,关于对象的垃圾能力,最重要的一点是,不能在对象中留下任何与类之外的其他对象组合在一起的处理程序。例如,必须正确删除事件侦听器。
还请看一看本文https://code.tutsplus.com/tutorials/understanding-garbage-collection-in-as3--active-4412
在回答你的主要问题时:
是。你的班级将成功垃圾收集!
发布于 2016-11-02 02:06:27
您应该在类中而不是在函数中定义c。
public class Main extends MovieClip {
private var c:CustomizationScreen;
public function Main() {
c = new CustomizationScreen(200,-20);
c.b.addEventListener(Event,func);
addChild(c);
}
}你需要在c.b,而不是c上删除eventListener。
public function dispose():void
{
c.b.removeEventListener(Event,func);
removeChild(c);
c=null;
}如果有其他类对a和b的引用,最好在CustomizationScreen中将a和b设置为null。
https://stackoverflow.com/questions/40362728
复制相似问题