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

Résolu
sanstenarios Messages postés 10 Date d'inscription lundi 20 octobre 2008 Statut Membre Dernière intervention 4 janvier 2009 - 20 oct. 2008 à 18:38
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

10 réponses

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
Merci Peg' pour la réorientation, ça fonctionne mieux et c'est plus clair.
3
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
20 oct. 2008 à 18:56
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'
0
sanstenarios Messages postés 10 Date d'inscription lundi 20 octobre 2008 Statut Membre Dernière intervention 4 janvier 2009
20 oct. 2008 à 20:28
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...
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
20 oct. 2008 à 20:32
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'
0

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

Posez votre question
sanstenarios Messages postés 10 Date d'inscription lundi 20 octobre 2008 Statut Membre Dernière intervention 4 janvier 2009
20 oct. 2008 à 20:41
Parce que je ne sais pas faire ;)

je voudrais virer les listener et également supprimer les objets (loader) créés...
0
sanstenarios Messages postés 10 Date d'inscription lundi 20 octobre 2008 Statut Membre Dernière intervention 4 janvier 2009
20 oct. 2008 à 21:02
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 ?
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
20 oct. 2008 à 21:08
tout comme tu as "addEventListener", tu as "removeEventListener" ...
Peg'
0
sanstenarios Messages postés 10 Date d'inscription lundi 20 octobre 2008 Statut Membre Dernière intervention 4 janvier 2009
20 oct. 2008 à 22:35
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();
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
20 oct. 2008 à 22:56
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'
0
sanstenarios Messages postés 10 Date d'inscription lundi 20 octobre 2008 Statut Membre Dernière intervention 4 janvier 2009
20 oct. 2008 à 23:51
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)
0
Rejoignez-nous