在AS3中删除Parent:这是否释放了所有孩子使用的内存?

时间:2010-09-17 09:44:18

标签: actionscript-3 removechild displayobject

我正在制作一个相当大的Flash项目,因此我担心内存使用情况。在应用程序的每个部分的末尾,我删除了包含内容的首要父元素。虽然这会移除父节点,但是这也会释放其中包含的每个子节点的内存,还是应该在删除父节点之前运行迭代来删除它们?

如果我没有表达我想要的内容,我会给出更多解释:

addChild(movie1);
movie1.addChild(movie2);
movie1.addChild(movie3);

使用此代码:

removeChild(movie1);

它是从内存中删除movie2和movie3还是仍然存储,只是取消链接?

3 个答案:

答案 0 :(得分:3)

如果另一个对象不再引用movie2movie3,则应该对它们进行垃圾回收。这同样适用于movie1

来自Creating visual Flex components in ActionScript

  

以编程方式删除控件,   你可以使用removeChild()或   removeChildAt()方法。你也可以   使用removeAllChildren()方法   从a中删除所有子控件   容器。调用这些方法可以   实际上并没有删除对象。如果   你没有任何其他参考   对于孩子,Flash Player包含它   在一些未来的垃圾收集   点。但是如果你存储了一个引用   对某个对象的孩子,   孩子不会从记忆中移除。

答案 1 :(得分:1)

嗯,到目前为止,内存中没有任何内容被删除,这实际上取决于movie1的引用方式。假设您稍后在应用程序中再次添加movie1,您应该会发现movie1不仅仍然在这里,而且还包含movie2& MOVIE3。

var movie1:MovieClip;

whatever();
anotherMethod();

function whatever():void
{
    movie1 = new MovieClip();
    var movie2:MovieClip = new MovieClip();
    var movie3:MovieClip = new MovieClip();
    movie1.addChild(movie2);
    movie1.addChild(movie3);
    addChild(movie1);

    whateverElse();
}

function whateverElse():void
{ 
    //here, nothing is garbage collected, movie1 exists outside
    //the scope of this function
    removeChild(movie1);

    //now you can
    tryThis();

    //but if you do this you're effectively killing movie2 & movie3 , since
    //they're not referenced anywhere else.
    removeChild(movie1);
    movie1 = null;

    //this is going to throw an error , movie1's gone!
    tryThis();
}

function tryThis():void
{
    //yes ,it's still here with all its content
    addChild(movie1);
}

function anotherMethod():void
{
    var movieN:MovieClip = new MovieClip();
    var movie2:MovieClip = new MovieClip();
    var movie3:MovieClip = new MovieClip();
    movieN.addChild(movie2);
    movieN.addChild(movie3);

    // do all you need to do... 
    // then
    removeChild( movieN);
    getOut();
}

function getOut():void
{
   //life goes on without movieN, movie2 & movie3
   //waiting to be garbage collected
}

答案 2 :(得分:0)

当然,它会删除所有3个。

儿童电影1有两个孩子,电影2 + 3。 如果因为某些实例死亡而死亡,孩子们也可能会死亡。

也许我错了,但你也可以尝试:

trace(movie2);