我对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对象答案 0 :(得分:1)
正如您应该知道的那样,垃圾收集不是一个正常运行的过程,也不会完成,直到分配了有价值的内存。
The red line is our maximum allowed memory, then garbage called
但是关于对象的垃圾能力最重要的一点是,你的对象中不得留下任何与你课堂外的其他对象交流的处理程序。例如,必须正确删除事件侦听器。
另请参阅本文 https://code.tutsplus.com/tutorials/understanding-garbage-collection-in-as3--active-4412
回答你的主要问题:
是。你的课将成功垃圾收集!!
答案 1 :(得分:1)
您应该在类中定义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上的eventListener,而不是c。
public function dispose():void
{
c.b.removeEventListener(Event,func);
removeChild(c);
c=null;
}
如果有来自其他类的a和b的引用,你最好在CustomizationScreen中将a和b设置为null。