1

当我在程序的后期从数组中提取它们时,我需要在舞台上添加这三个对象。

我不能写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

4

2 回答 2

3

具体到用元素实例化你的数组,你可以:

var choices:Array = [ mall, library, music ];

Flash Player 运行时使用引用计数以及标记和清除。

因此,对实例的任何引用都会增加一个计数 - 集合、显示列表、事件侦听器、类成员......当实例被取消引用时,内存最终将被释放。

引用计数

堆上的每个对象都跟踪指向它的事物的数量。每次创建对对象的引用时,对象的引用计数都会增加。删除引用时,对象的引用计数会减少。如果对象的引用计数为零(没有任何东西指向它),则将其添加到零计数表 (ZCT)。当 ZCT 已满时,扫描堆栈以查找堆栈中对 ZCT 上的对象的任何引用。ZCT 上没有堆栈引用的任何对象都将被删除。

延迟引用计数的问题之一是循环引用。如果 ObjectA 和 ObjectB 相互引用,但系统中没有其他对象指向它们,则它们的引用计数永远不会为零,因此永远不会有资格使用引用计数进行垃圾收集。这就是标记和清除垃圾收集有帮助的地方。

标记/扫描

在 Flash Player 或 AIR 中运行的应用程序具有多个 GCRoot。您可以将 GCRoot 视为一棵树的树干,而应用程序的对象则视为分支。Stage 是一个 GCRoot。加载器是 GCRoots。某些菜单是 GCRoots。应用程序仍在使用的每个对象都可以从应用程序中的一个 GCRoot 访问。GCRoot 永远不会被垃圾回收。

应用程序中的每个对象都有一个“标记位”。当垃圾回收的标记阶段开始时,所有这些标记位都会被清除。MMgc 跟踪应用程序中的所有 GCRoot。垃圾收集器从这些根开始,跟踪每个对象并为它到达的每个对象设置标记位。从任何根不再可访问的任何对象都不再可从应用程序中的任何位置访问 - 在标记阶段不会设置其标记位。一旦收集器完成标记它找到的所有对象,扫描阶段就开始了。任何没有设置标记位的对象都会被销毁并回收其内存。

于 2013-05-08T02:44:21.870 回答
1

addChild 不会创建对象的实例,它只是将对象添加到当前显示容器的显示列表中。

使用new Mall()很好 - 只要确保在不再需要它时删除对它的引用,以便它可能被垃圾收集。或者,您可以只保存一组原语。

于 2013-05-08T02:30:16.203 回答