我正在做一个相当大的Flash项目,因此我担心内存使用情况。在应用程序的每个部分的末尾,我删除了包含内容的总体父元素。尽管这删除了父母,但是否还可以释放其中包含的每个孩子的内存,还是我应该在删除父母之前运行迭代以删除这些记忆?

我会在案例中给出更多解释,我没有表达我想要的东西:

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

通过使用此代码:

removeChild(movie1);

它是从内存中删除Movie2和Movie3还是仍然存储,只是UNINK?

有帮助吗?

解决方案

好吧,到目前为止,没有从内存中删除任何东西,这实际上取决于如何引用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
}

其他提示

如果 movie2movie3 不再被另一个对象引用,应该收集垃圾。同样适用 movie1.

在ActionScript中创建视觉挠性组件 :

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

当然,它消除了所有3个。

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

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

trace(movie2);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top