AS3内存管理
AS3 memory management
我有一个关于 as3 内存管理的问题。
例如,如果我有 class
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);
}
}
然后我在 main class
中实例化 class
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 对象吗?
如您所知,垃圾收集不是一个准时的过程,在分配了宝贵的内存之前不要完成。
The red line is our maximum allowed memory, then garbage called
但关于对象的垃圾处理能力最重要的一点是,对象中不得留下任何与 class 之外的其他对象通信的处理程序。例如事件侦听器必须正确删除。
也看看这篇文章
https://code.tutsplus.com/tutorials/understanding-garbage-collection-in-as3--active-4412
在回答您的主要问题时:
是的。您的 class 将被成功回收!!
您应该在 class 而不是函数
中定义 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;
}
你最好在CustomizationScreen中将a和b设置为null,如果有其他人对a和b的引用class。
我有一个关于 as3 内存管理的问题。
例如,如果我有 class
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);
}
}
然后我在 main class
中实例化 classpublic 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 对象吗?
如您所知,垃圾收集不是一个准时的过程,在分配了宝贵的内存之前不要完成。
The red line is our maximum allowed memory, then garbage called
但关于对象的垃圾处理能力最重要的一点是,对象中不得留下任何与 class 之外的其他对象通信的处理程序。例如事件侦听器必须正确删除。
也看看这篇文章 https://code.tutsplus.com/tutorials/understanding-garbage-collection-in-as3--active-4412
在回答您的主要问题时:
是的。您的 class 将被成功回收!!
您应该在 class 而不是函数
中定义 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;
}
你最好在CustomizationScreen中将a和b设置为null,如果有其他人对a和b的引用class。