我正在将名为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中的父级和所有子级的最佳方法是什么?
答案 0 :(得分:1)
是和否。孩子不再位于舞台上,但在调用removeChild()
之前,他们仍然是父母的孩子。这可能是好事也可能是坏事。显然,它对于重用对象很有用,但对于内存管理来说可能可怕,因为这些对象只能在其父进行垃圾回收时进行垃圾回收。对于一个简单的应用程序,通常很好。但对于大规模的东西......不是那么多。
对于我现在正在处理的项目(一个30页,50,000个内容),我创建了一个轻量级的GUI框架来处理我的所有DisplayObjects。除基本Bitmap
和Shape
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()调用会堆积,这可能是灾难性的互相攻击并冻结应用程序。