Garbage Collector

Résolu
Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011 - 19 juil. 2009 à 18:14
Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011 - 22 juil. 2009 à 17:51
Hello,

Juste une question pour savoir si on est conseillé d'utiliser le garbage collector ?

Exemple :
function changeSection(e:MouseEvent):void
{
   if(myClip){
      removeChild(myClip);
      myclip = null;
   }
   var myClip:MovieClip = new MovieClip();
   myClip.name = "myClip0";
   addChild(myClip); 
}

myBtn.addEventListener(MouseEvent.CLICK, changeSection);


Donc savoir si cette partie est conseillée :
if(myClip){
      removeChild(myClip);
      myclip = null;
}


Merci

A+

Orange73

10 réponses

nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
22 juil. 2009 à 17:37
Salut,

tout est presqu'exact . Alors en reprenant ta logique, tu dois creer une fonction dispose():

1- supprimant de la scene du clip (A) les clips presents dans le clip A via boucle en supprimant les EventListener s'il y en a et en mettant a null ces clips

2- supprimant de la scene du clip (B) le textfield dans le clip B puis le mettre a null

3- supprimant de la scene du clip (S) le clip A et B puis en les mettant a null

4- supprimant de la scene le clip S

Il reste enfin a mettre a null l'objet CustomClass lui-meme, mais comment ?
myObjt = null;

avant l'instanciation de celui ci en vérifiant s'il existe ?
tres bonne idee mais pas necessaire sauf si tu reutilises ta variable maintes fois avec des donnees differentes et qu'il te faut absolument recreer un clip (S) a chaque fois.

Petite chose, les clips presents (par exemple) dans le clip a sont mis a null seulement si tu as une reference sur eux.
exemple

var txt:TextField new TextField, clipA:Sprite new Sprite;

clipA.addChild(txt); //<---- dans ce cas lors du dispose txt doit etre mis a null

function rajouterTextField():void
{
clipA.addChild(new TextField);//<--- reference faible: mettre clipA a null suggere que ce textField est aussi libre
}
http://liveplayaz.com
je suis heureux de faire partie d'une grande famille ...!
3
faiblard Messages postés 337 Date d'inscription samedi 3 février 2007 Statut Membre Dernière intervention 4 janvier 2011
20 juil. 2009 à 16:09
Bonjour,

De toutes façon il vaut mieux supprimer un objet/variable si tu n'en as plus besoin...

Pour ce qui est du garbage collector il passe quand il veut tu n'as pas la main dessus :D Il peut même ne jamais passer....

-------------------------------------------------------------------
La recherche est ton amie ! Promis elle ne te mordra pas...
Enjoy
N'oubliez pas d'accepter pour aidez les autres quand ils cherchent !
0
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
20 juil. 2009 à 16:10
Salut,

premierement , ca ne sert a rien de detruire une variable si tu comptes la reutiliser(la reallouer avec les memes proprietes) encore apres. Je m'excuse d'avance si c'est juste le fait de ne pas bien avoir compris le but de l'exemple.
Pour ta question de Garbage collection, 3 conseils:

1- toutes les variables doivent etres mises a nulles , les composants graphiques (shape,sprite,bitmap et autres) doivent etre retires de la scene avant d'etre mis a null. exemple ton removeChild(myClip) suivi de myClip = null;

2- si jamais tu utilises un ecouteur d'evenements, utilise le avec une reference faible.
myBtn.addEventListener(MouseEvent.CLICK, changeSection,false,0,true);
false: a la phase cible
0 : niveau de priorite
true : utilise une reference faible

Avant donc de mettre a null, ta variable, deleste la de l'ecouteur d'evenement.
myBtn.removeEventListener(MouseEvent.CLICK, changeSection,false);

3- Si necessaire (mais moins souvent que possible neanmoins) faire un appel a System.gc();

au revoir et Bonne continuation.


http://liveplayaz.com
je suis heureux de faire partie d'une grande famille ...!
0
faiblard Messages postés 337 Date d'inscription samedi 3 février 2007 Statut Membre Dernière intervention 4 janvier 2011
20 juil. 2009 à 16:24
Sauf que System.gc() ne marche uniquement que dans la version debogueur du flash player !

Pour en revenir a la réutilisation d'une variable je ne suis pas d'accord avec nicky, si tu dois réutilisé ta variable mais seulement dans très longtemps je ne vois pas l'utilité de la conserver...
-------------------------------------------------------------------
La recherche est ton amie ! Promis elle ne te mordra pas...
Enjoy
N'oubliez pas d'accepter pour aidez les autres quand ils cherchent !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011
20 juil. 2009 à 20:43
ok,

merci pour vos réponse..

maintenant, j'ai une autre question a propos de cela :

Imaginons que j'ai une classe CustomClass possedant des methodes dont une creant un sprite et l'ajoutant au stage via addChild();

Ce sprite possede des EventListeners.

Si ma classe est instanciée et que je souhaite supprimer cet objet plus tard... dois-je crée une methode dispose(); supprimant le sprite de la scene ainsi que ses EventListeners puis mettre ce sprite a null ? ou le fait de mettre simplement l'instance a null est suffisant ?

Merci


-- Orange73 --

"L'homme n'est pas fait pour travailler, la preuve c'est que cela le fatigue" (Voltaire)
0
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
20 juil. 2009 à 22:53
Salut,

la premiere option est celle que je conseille, et que je mets en pratique dans mes codes:
creer une fonction membre qui libere les variables membres relatives a un objet avant de le liberer lui-meme.


Bonne continuation
http://liveplayaz.com
je suis heureux de faire partie d'une grande famille ...!
0
Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011
21 juil. 2009 à 09:15
Ok, merci pour ta réponse.

Du coup imaginons que dans ma classe je fais une boucle creant par exemple une dizaine de sprite ou autre... Dans la méthode dispose(); je dois recreer cette boucle puis supprimer leurs EventListeners ainsi que les mettre a null ?

Merci


-- Orange73 --

"L'homme n'est pas fait pour travailler, la preuve c'est que cela le fatigue" (Voltaire)
0
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
21 juil. 2009 à 15:01
Salut,

c'est entierement exact , et si tu les ajoutes dans un conteneur retire-les du conteneur aussi .

Bonne continuation.
http://liveplayaz.com
je suis heureux de faire partie d'une grande famille ...!
0
Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011
22 juil. 2009 à 09:18
Hello,

Merci

Dernière chose (je penses ),

imaginons ce code :

myObj:CustomClass = new CustomClass();


Cette classe créé un sprite (S) en l'ajoutant a la scene avec addChild();
Dans ce sprite, creation de 2 clips, l'un (A) contenant une dizaine de clip créé via boucle for et l'autre (B) contenant un simple textfield.

Donc, si j'ai bien compris, je dois créer une methode dispose(); par exemple,
- supprimant de la scene les clips present dans le clip A via boucle en supprimant les EventListener s'il y en a et en mettant a null ces clips
- supprimant de la scene le textfield dans le clip B puis les mettre a null
- supprimant de la scene le clip A et B puis en les mettant a null
- supprimant de la scene le clip S

Il reste enfin a mettre a null l'objet CustomClass lui-meme, mais comment ?
- dans la methode dispose()

this = null


- avant l'instanciation de celui ci en vérifiant s'il existe ?

if(myObj != null)
{
   myObj.dispose();
   myObj = null;
}
myObj:CustomClass = new CustomClass();



Merci.

-- Orange73 --

"L'homme n'est pas fait pour travailler, la preuve c'est que cela le fatigue" (Voltaire)
0
Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011
22 juil. 2009 à 17:51
ok,

merci beaucoup pour toutes ces precisions :-)


-- Orange73 --

"L'homme n'est pas fait pour travailler, la preuve c'est que cela le fatigue" (Voltaire)
0
Rejoignez-nous