我需要在舞台上添加这三个对象,当我在程序的后期从数组中提取它们时。
我不能写var mall: Mall = new Mall ();
,因为之前有人告诉我,这会在内存中添加对象,如果处理很多对象会非常糟糕。稍后我会有更多的对象可供使用。
所以我想知道一种方法,当我运行for循环或事件监听器时,我可以自动添加... = new object ();
,然后调用addchild来创建对象的实例。
var mall:Mall;
var library:Library;
var music:Music;
var choices:Array = new Array ();
choices.push(mall,library,music);
测试垃圾收集代码:
var waking: WakingUp = new WakingUp ();
addChild (waking);
waking.y=-30;
waking.addEventListener (Event.ENTER_FRAME, waking_up);
function waking_up (g:Event){
if (waking.currentFrame == waking.totalFrames)
{
waking.stop ();
waking.removeEventListener (Event.ENTER_FRAME,waking_up);
removeChild (waking);
removeChild(alarm_slide);
gotoAndStop (6);
}
}
这是我对此代码的所有参考:D
答案 0 :(得分:3)
具体到使用元素实例化数组,您可以:
var choices:Array = [ mall, library, music ];
Flash Player运行时使用引用计数以及标记和扫描。
因此,对实例的任何引用都会添加一个计数 - 集合,显示列表,事件监听器,类成员......当实例被取消引用时,内存最终将被释放。
参考计数
堆上的每个对象都会跟踪指向它的内容的数量。每次创建对象的引用时, 对象的引用计数递增。删除引用时 对象的引用计数递减。如果对象为零 引用计数(没有任何指向它),它被添加到零 计数表(ZCT)。当ZCT已满时,扫描堆栈以查找 从堆栈到ZCT上的对象的任何引用。任何对象 没有堆栈引用的ZCT将被删除。
延迟引用计数的一个问题是循环引用。如果ObjectA和ObjectB彼此引用但没有其他引用 系统中的对象指向它们,它们永远不会为零 引用计数,因此永远不会有资格获得垃圾 使用引用计数收集。这是标记和扫描的地方 垃圾收集帮助。
<强>标记/扫描强>
在Flash Player或AIR中运行的应用程序具有多个GCRoot。 您可以将GCRoot视为具有对象的树的树干 作为分支机构的应用程序。舞台是一个GCRoot。装载机是 GCRoots。某些菜单是GCRoots。每个仍在使用的对象 通过应用程序可以从其中一个GCRoots到达 应用。 GCRoots永远不会被垃圾收集。
应用程序中的每个对象都有一个“标记位”。当Mark阶段 垃圾收集开始,所有这些标记位都被清除。该 MMgc跟踪应用程序中的所有GCRoot。垃圾 收集器从那些根开始,遍历每个对象和集合 它到达的每个对象的标记位。任何不再是的对象 无法从任何地方访问任何根目录 在应用程序中 - 它的标记位在Mark期间没有设置 相。收集器完成后,标记它找到的所有对象, 扫描阶段开始。任何没有设置标记位的对象都是 被摧毁并恢复了记忆。
答案 1 :(得分:1)
addChild不会创建对象的实例,只是将对象添加到当前显示容器的displaylist中。
使用new Mall()
很好 - 只需确保在不再需要时删除对它的引用,以便可以对其进行垃圾回收。或者,您可以只保存一组基元。