Domanda

sto facendo una piuttosto grande progetto di flash e così mi sono preoccupato per l'utilizzo della memoria. Alla fine di ogni sezione dell'applicazione tolgo l'elemento principale generale che contiene il contenuto. Anche se questo rimuovere il genitore, fa questo anche liberare la memoria per ciascuno dei bambini contenute in questo, o devo eseguire un'iterazione per rimuovere quelli prima di rimuovere il genitore?

Ti darò un po 'più spiegazione in caso non sto esprimendo quello che voglio:

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

Utilizzando questo codice:

removeChild(movie1);

lo rimuove Cinema2 e Video3 dalla memoria o sono ancora conservati, appena scollegato?

È stato utile?

Soluzione

Beh, niente viene rimosso dalla memoria fino ad ora, in realtà dipende da come Movie1 viene fatto riferimento. Diciamo che nel corso della applicazione che si desidera aggiungere Movie1 ancora una volta, si dovrebbe trovare che Movie1 non solo è ancora qui ma contiene anche Cinema2 & Video3.

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
}

Altri suggerimenti

Se movie2 e movie3 non si fa riferimento più da un altro oggetto, che dovrebbe essere garbage collection. Lo stesso vale per movie1.

Creazione di componenti visuali Flex in ActionScript :

  

Per rimuovere a livello di codice un controllo,   è possibile utilizzare la removeChild () o   removeChildAt () metodi. Puoi anche   utilizzare i removeAllChildren () per   rimuovere tutti i controlli figlio da un   contenitore. Si chiamano questi metodi fa   in realtà non eliminare gli oggetti. Se   non si hanno altri riferimenti   al bambino, Flash Player lo include   in garbage collection in un futuro   punto. Ma se memorizzato un riferimento   a quel bambino su qualche oggetto, il   bambino non viene rimosso dalla memoria.

Naturalmente esso rimuove tutte le 3.

Bambino filmato 1 ha due figli, Cinema2 + 3. Se muore a causa di qualche grado decesso i bambini saranno possibilmente morire anche.

Forse mi sbaglio, ma si può anche provare:

trace(movie2);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top