在Array中实例化

时间:2013-05-08 02:24:22

标签: actionscript-3

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

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

2 个答案:

答案 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()很好 - 只需确保在不再需要时删除对它的引用,以便可以对其进行垃圾回收。或者,您可以只保存一组基元。