Question

Je fais un projet flash assez grand et je suis préoccupé par l'utilisation de la mémoire. A la fin de chaque section de l'application I supprimer l'élément parent primordial qui détient le contenu. Bien que ce supprimer le parent, ce ne libère aussi la mémoire pour chacun des enfants contenus dans ce, ou devrais-je exécuter une itération pour éliminer les avant de retirer le parent?

Je vais donner un peu plus d'explications en cas, je ne suis pas ce que je veux exprimer:

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

En utilisant ce code:

removeChild(movie1);

-t-il supprimer Movie2 et movie3 de mémoire ou sont-ils encore stockés, juste dissociées?

Était-ce utile?

La solution

Eh bien, rien est supprimé de la mémoire à ce jour, cela dépend vraiment de la façon dont movie1 est référencé. Disons que plus tard dans l'application que vous souhaitez ajouter movie1 à nouveau, vous devriez constater que movie1 est non seulement encore ici, mais il contient aussi Movie2 et 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
}

Autres conseils

Si movie2 et movie3 ne sont pas référencés plus par un autre objet, ils devraient être les déchets ramassés. Même pour movie1.

De Création de composants Flex visuels dans ActionScript :

  

Pour supprimer un programme de contrôle,   vous pouvez utiliser la méthode removeChild () ou   méthodes removeChildAt (). Vous pouvez également   utiliser la méthode removeAllChildren () pour   supprimer tous les contrôles enfants d'un   récipient. Pour appeler ces méthodes ne   ne pas supprimer réellement les objets. Si   vous n'avez pas d'autres références   à l'enfant, Flash Player comprend ce   dans la collecte des ordures à un avenir   point. Mais si vous avez enregistré une référence   à cet enfant sur un objet, la   enfant n'est pas supprimé de la mémoire.

Ofcourse il supprime tous les 3.

film enfant 1 a deux enfants, Movie2 + 3. S'il meurt à cause d'une instance DECES les enfants possibily mourir aussi.

Peut-être que je me trompe, mais vous pouvez aussi essayer:

trace(movie2);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top