2

我正在制作一个相当大的闪存项目,所以我担心内存使用情况。在应用程序的每个部分结束时,我删除了包含内容的总体父元素。尽管这删除了父级,但这是否也释放了其中包含的每个子级的内存,还是我应该运行迭代以在删除父级之前删除那些?

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

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

通过使用此代码:

removeChild(movie1);

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

4

3 回答 3

3

如果movie2并且movie3不再被另一个对象引用,它们应该被垃圾收集。这同样适用于movie1

在 ActionScript 中创建可视 Flex 组件

要以编程方式删除控件,可以使用 removeChild() 或 removeChildAt() 方法。您还可以使用 removeAllChildren() 方法从容器中删除所有子控件。调用这些方法实际上并不删除对象。如果您没有对子项的任何其他引用,Flash Player 将在将来的某个时间点将其包含在垃圾收集中。但是,如果您在某个对象上存储了对该子项的引用,则该子项不会从内存中删除。

于 2010-09-17T09:50:17.123 回答
1

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

var movie1:MovieClip;

任何();
另一个方法();

函数whatever():void
{
    电影1 = 新电影剪辑();
    var movie2:MovieClip = new MovieClip();
    var movie3:MovieClip = new MovieClip();
    电影1.addChild(电影2);
    电影1.addChild(电影3);
    addChild(movie1);

    无论如何();
}

函数whateverElse():void
{
    //这里,没有垃圾回收,movie1存在于外面
    //这个函数的作用域
    removeChild(movie1);

    //现在你可以
    试试这个();

    //但是如果你这样做,你实际上是在杀死 movie2 和 movie3 ,因为
    //它们没有在其他任何地方引用。
    removeChild(movie1);
    电影1 =空;

    //这会抛出一个错误,movie1 不见了!
    试试这个();
}

函数 tryThis():void
{
    //是的,它的所有内容都还在这里
    addChild(movie1);
}

函数另一个方法():无效
{
    var movieN:MovieClip = new MovieClip();
    var movie2:MovieClip = new MovieClip();
    var movie3:MovieClip = new MovieClip();
    电影N.addChild(movie2);
    电影N.addChild(movie3);

    // 做所有你需要做的...
    // 然后
    removeChild(movieN);
    出去();
}

函数getOut():无效
{
   //没有movieN,movie2和movie3,生活继续
   //等待垃圾回收
}
于 2010-09-17T10:30:30.510 回答
0

当然,它会删除所有 3。

孩子电影 1 有两个孩子,电影 2 + 3。如果他因某些 Instance 死亡而死,孩子们也可能会死。

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

trace(movie2);
于 2010-09-17T09:48:31.947 回答