as3 if remove Parent是否也删除了所有孩子?

时间:2013-05-17 22:58:54

标签: performance actionscript-3 removechild addchild

我正在将名为Spiri的mc加载到名为Box的mc中。后来我想从内存使用和屏幕外删除。我在这里没有显示补间屏幕。

如果我使用removeChild(box);,它还会删除所有包含在内的儿童吗? 基本上我正在通过函数调用从库中加载3部电影。然后尝试删除它们并多次调用相同的函数。这意味着相同的电影会一次又一次地加载相同的名称。这是支持替换旧的,但可能不是因为我没有正确删除它们,因为通过第10或第15次呼叫它变得非常慢。

我也在函数中添加了一个事件监听器。那么那么每次都会添加一些event-Listner并占用资源吗?

经过多次运行该功能似乎非常慢,这让我相信某些东西没有正确卸载。

//I tried 
box.removeChild(Spiri);
Spiri = null;
//then remove the parent like this
removeChild(box);  /// but this gets an error.
again if i just do this
removeChild(Spiri); // it makes me wondering if they are getting removed.

如何删除mc中的父级和所有子级的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

是和否。孩子不再位于舞台上,但在调用removeChild()之前,他们仍然是父母的孩子。这可能是好事也可能是坏事。显然,它对于重用对象很有用,但对于内存管理来说可能可怕,因为这些对象只能在其父进行垃圾回收时进行垃圾回收。对于一个简单的应用程序,通常很好。但对于大规模的东西......不是那么多。

对于我现在正在处理的项目(一个30页,50,000个内容),我创建了一个轻量级的GUI框架来处理我的所有DisplayObjects。除基本BitmapShape DisplayObject之外的所有内容都会扩展一个扩展Sprite的类。在那堂课中,我有这个功能:

final public function destroy():void {
    this.removeAllEventListeners();

    var i:int, l:int, cur:DisplayObject;
    l = this.numChildren;

    for ( i = 0; i < l; i++ ) {
        cur = this.getChildAt( i );

        if ( cur is XISprite && !this.stopChildXISpriteDestroy ) {
            ( cur as XISprite ).destroy();
        }
        else if ( cur is Sprite ) {
            ( cur as Sprite ).removeChildren();
        }

        if ( cur is Bitmap && ( cur as Bitmap ).bitmapData && !this.stopBitmapDestroy ) {
            ( cur as Bitmap ).bitmapData.dispose();
        }

        if ( cur is Loader && !this.stopLoaderDestroy ) {
            ( cur as Loader ).unload();
        }

        if ( cur is Shape ) {
            ( cur as Shape ).graphics.clear();
        }
    }

    cur = null;
    i = l = NaN;

    this.removeChildren();
}

它基本上对所有对象进行了彻底的擦除,并允许我轻松地限定该类的所有子项以进行垃圾收集。我还跟踪所有事件监听器,因此根本没有机会监听器可以阻止GC(通过调用removeAllEventListeners())。我在类中也有一些受保护的标志,允许你停止某种对象类型的破坏(所以我可以在需要时保留SWF或图像加载到内存中)

它可能有点过分,但内存消耗一直是这个应用程序中的一个问题,而且该功能确实有助于管理它。这可能超出了您的需要,因此您可以使用默认参数调用removeChildren(),它将从父对象中删除所有子项。

作为一个事后的想法:保持您的DisplayObjectContainers尽可能简单。避免尽可能经常嵌套它们。第一个条件,我在XISprite的每个XISprite上调用destroy是伟大的但是如果有一些XISprite子项的加载和加载,因为destroy()调用会堆积,这可能是灾难性的互相攻击并冻结应用程序。