La suppression d'un objet entraine t elle la suppression des listeners liés ? [Résolu]

Messages postés
10
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
4 janvier 2009
- - Dernière réponse : sanstenarios
Messages postés
10
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
4 janvier 2009
- 22 oct. 2008 à 00:59
Bonjour,

je découvre as3 depuis qqs jours,

lorsque je supprime un objet  avec removeChild(getChildByName(instance)) est-ce que les listeners liés à l'instance sont automatiquement supprimés ? (ce qui m'arrangerait énormément)

Merci pour votre aide
Afficher la suite 

10 réponses

Meilleure réponse
Messages postés
10
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
4 janvier 2009
3
Merci
Merci Peg' pour la réorientation, ça fonctionne mieux et c'est plus clair.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 5984 internautes nous ont dit merci ce mois-ci

Commenter la réponse de sanstenarios
Messages postés
6161
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6
0
Merci
Bonsoir

Lorsque tu fais un removeChild(); tu ne fais qu'enlever l'objet de la liste d'affichage, mais tu ne le détruis pas.
Il existe toujours en mémoire mais n'est pas affiché. Ce qui fait qu'effectivement ces listeners sont toujours actifs.

Peg'
Commenter la réponse de pegase31
Messages postés
10
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
4 janvier 2009
0
Merci
Merci Peg', réponse claire. Il faut que je procède autrement alors.

Disons que j'utilise un tableau loader2Arr pour stocker les loader que je créé dans une boucle pour afficher des petites images.

loader2Arr[i] = new Loader();
 loader2Arr[i].load(new URLRequest(xmlData.rubrique[nRub].article[nArt].icones.icone[0]));
addChild(loader2Arr[i]);
loader2Arr[i].addEventListener(MouseEvent.CLICK, AfficheDetail);

est-ce que si je lance une boucle de suppression
for (vari=0; i < loader2Arr.length; i++){
   loader2Arr[i] = null;
}

je supprime les éléments affichés ainsi que les listeners ? J'ai pas l'impression en fait...
Commenter la réponse de sanstenarios
Messages postés
6161
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6
0
Merci
pourquoi ne crées-tu pas une fonction qui détruit les écouteurs présents dans ton objet, plutôt ?
Le fait de mettre un objet à null ne le détruit pas en mémoire (c'est un gros soucis du garbageCollector, d'ailleurs) ...

Peg'
Commenter la réponse de pegase31
Messages postés
10
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
4 janvier 2009
0
Merci
Parce que je ne sais pas faire ;)

je voudrais virer les listener et également supprimer les objets (loader) créés...
Commenter la réponse de sanstenarios
Messages postés
10
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
4 janvier 2009
0
Merci
je viens de découvrir delete
delete load2Arr[i];

mais ça ne supprime pas l'élément affiché, et je suppose que ça ne supprime pas non plus les listener liés à l'objet si ?
Commenter la réponse de sanstenarios
Messages postés
6161
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6
0
Merci
tout comme tu as "addEventListener", tu as "removeEventListener" ...
Peg'
Commenter la réponse de pegase31
Messages postés
10
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
4 janvier 2009
0
Merci
oui, je pensais qu'on pouvait s'en passer si on supprimait l'objet.

ma difficulté est de pouvoir supprimer les listener sans passer par la fonction lancée par l'eventListener.

j'ai un tableau de tous les loader créés et ajoutés à la scène et c'est à partir de ce tableau que j'aimerais pouvoir les supprimer...
loader2Arr[i] = new loader(...

for (i=0, i<loader2Arr.length; i++){
    loader2Arr[i] = new Loader();
    loader2Arr[i].load(new URLRequest(xmlData.rubrique[nRub].article[nart].icones.icone[0]));
    addChild(loader2Arr[i]);
    loader2Arr[i].addEventListener(MouseEvent.CLICK, AfficheDetail);
}

for (i=0, i<loader2Arr.length; i++){

    if(loader2Arr[i].hasEventListener(MouseEvent.CLICK)){
        loader2Arr[i].removeEventListener(MoueEvent.CLICK, AfficheDetail);
    }

}

Sauf que je viens de m'apercevoir que la longueur de load2Arr est égale à 1 !! alors que j'initie un dizaine de fois loader2Arr[i]=new Loader();

Comment dois-je déclarer load2Arr ? Pour l'instant j'ai fait
load2Arr : Array = new Array();
Commenter la réponse de sanstenarios
Messages postés
6161
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6
0
Merci
la création d'objets à la volée est une mauvaise idée en as3 ... ça ne marche plus comme en as1/2
De plus, afficher directement le loader est mauvais .. pourquoi ne fais-tu pas un loader simple qui chargera au fur et à mesure les images ?

à partir de là tu crées des sprites dans lesquels tu colles les images et le tour est joué.

Peg'
Commenter la réponse de pegase31
Messages postés
10
Date d'inscription
lundi 20 octobre 2008
Statut
Membre
Dernière intervention
4 janvier 2009
0
Merci
C'est sympa de pas me laisser dans le vide ;

en fait as1 ou 2, connais pas, pas developpé en flash avant.

Les icones que je charge sont intégrées à l'instance d'un movie clip désigné par une graphiste dans l'interface flash auteur.

il y  a plusieurs rubriques, chacun comporte son jeu d'icones, et en fonction d'un clic sur le bouton de rubrique, le movie clip s'initialise et s'affiche ou bien s'efface si on reclic sur le meme bouton. Chaque icone mene ensuite vers un movieclip affichant un zoom de l'icone, du texte et une serie d'icone pour accéder à des images alternatives de l'image première.

je récupère ça via un XML généré par spip et je génère les menus à la volée, et plutot que d'avoir 5 instances du movie clip (5 rubriques) j'ai pour l'instant choisi de vider et repeupler le meme movieclip mais finalement avec tes commentaires, je me dis que je ferais mieux de charger autant d'instances du clip que j'ai de rubriques... et que ce soit chargé une fois pour toutes plutot que de charger à chaque fois dans le même.

Tu écris qu'afficher directement le loader est mauvais, mais si je le charge dans un movie clip c'est correct non ?

loader = new Loader();
loader.load(new URLRequest(xmlData.rubrique[nRub].article[nart].icones.icone[0]));
loader.x = coordX;
loader.y = -(80 +(40*(nart)));
bandeauRub_vertical_mc.addChild(loader);
bandeauRub_vertical_mc.loader.addEventListener(MouseEvent.CLICK, AfficheDetail)
Commenter la réponse de sanstenarios