Pregunta

Estoy haciendo un proyecto de Flash bastante grande y por lo que estoy preocupado por el uso de memoria. Al final de cada sección de la solicitud elimino el elemento padre general que tiene el contenido. Aunque esto elimina la primaria, ¿esto también liberar la memoria para cada uno de los niños que aparecen en este, o debería ejecutar una iteración para eliminar los antes de retirar el padre?

Me voy a dar un poco más de explicación en caso de que no estoy expresando lo que quiero:

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

Al utilizar este código:

removeChild(movie1);

¿Se quitar movie2 y movie3 de la memoria o están siendo almacenada, tal desvincula?

¿Fue útil?

Solución

Bueno, nada se elimina de la memoria hasta el momento, que realmente depende de cómo movie1 se hace referencia. Digamos que más adelante en la aplicación que desea agregar movie1 de nuevo, usted debe encontrar que movie1 no sólo es todavía aquí, pero también contiene movie2 y 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
}

Otros consejos

Si movie2 y movie3 no se hace referencia más por otro objeto, que debe ser basura recogida. Lo mismo se aplica para movie1.

Creación de componentes visuales Flex en ActionScript :

Para eliminar programación un control, se puede utilizar el removeChild () o removeChildAt () métodos. Tú también puedes utilizar los removeAllChildren () para eliminar todos los controles secundarios de una envase. Llamar a estos métodos hace en realidad no eliminar los objetos. Si usted no tiene ninguna otra referencia para el niño, que incluye Flash Player en la recolección de basura en algún futuro punto. Pero si ha almacenado una referencia a ese niño en algún objeto, el niño no se elimina de la memoria.

Por supuesto que elimina toda la 3.

película Niño 1 tiene dos hijos, movie2 + 3. Si muere a causa de algún deceso Instancia los niños eventualmente de morir también.

Tal vez me equivoque, pero también puede probar:

trace(movie2);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top