2009-07-09 5 views

Répondre

10

Bien sûr ... annule l'enregistrement de ses minuteurs et de ses événements, supprime-le de son parent et supprime toutes les références.

En d'autres termes, AS3 est un langage collecté par garbage, donc vous ne pouvez pas contrôler quand un objet (y compris un MC) est vraiment supprimé de la mémoire. Lorsque vous supprimez toutes les références (y compris l'enregistrement d'un événement), le CPG détecte qu'il n'est plus nécessaire et le nettoie pour vous.

Une chose que vous pouvez (et devez) faire est, lorsque vous vous enregistrez pour des événements, réglez le paramètre useWeakReference sur true. C'est:

myMC.addEventListener(Event.ENTER_FRAME, onFrame, false, 0, true); 

Cela dit AS3 que cet écouteur d'événement particulier ne doit pas compter comme une référence - donc si vous supprimez toutes les autres références à la MC, il va obtenir les déchets ramassés même si vous ne désenregistrez pas l'auditeur . (Quant aux timers, si vous utilisez setTimeout ou setInterval, pour autant que je sache, ils ne sont pas non plus considérés comme des références, mais je n'en suis pas sûr.)

Donc, le long et le court , il n'y a aucun moyen de nuke votre MC et obtenir Flash pour tout nettoyer. C'est ainsi que fonctionne AS3 - la gestion de vos références et de vos événements fait partie d'un codage consciencieux. Si votre MC n'a plus de minuteries ou d'événements, est retiré de son parent, et n'est référencé par aucune partie de votre code, c'est quand il est parti.

2

Loader.unloadAndStop()

cité http://www.gskinner.com/blog/archives/2008/07/additional_info.html:

Voici la liste des choses qui ne unloadAndStop pour préparer les fonds souverains chargés de la collecte:

  • Arrête tous MovieClips
  • Arrêts tous les sons en cours de lecture/diffusion
  • Arrêter/supprimer tous les objets Minuterie
  • Supprimer tous les programmes d'écoute pour enterFrame, exitFrame, frameconstructed, activate, deactivate
  • Supprime tous les écouteurs d'étape créés par l'enfant.
  • tous NetConnection Ferme/NetStream
  • Video.attachNetStream/attachCamera (0)
  • Microphone.setLoopback (0)
  • polices AS3 Supprime de la table globale de polices
  • Arrête prises, XMLSockets, téléchargements FileReference, le téléchargement d'autres objets (petits SWF), etc.
  • Libère bitmap lié à cacheAsBitmap/filtre, etc.

noter que tous les ab ove sont exécutées de manière récursive, de sorte qu'ils s'appliquent également à tous les enfants imbriqués, y compris les autres fichiers SWF chargés.

+1

Notez que ceci est uniquement pour les swfs chargés, pas pour les MovieClips. – Cay

1

J'ai vu certains événements, en particulier les événements Timer, ne pas se déclencher lorsque useWeakReference est défini sur true. Alors, soyez prudent avec la suggestion de fenomas.Je crée généralement une fonction dealloc dans mes MovieClips et addEventListener(Event.REMOVED_FROM_STAGE, dealloc); La fonction dealloc se déclenche lorsque vous removeChild() ce MovieClip.

Il est recommandé de prendre soin de ces données soi-même avec Flash, en particulier lorsqu'il existe des incohérences qui apparaissent plus souvent que nous le souhaiterions.

1

Jeremy, pour éviter que vos événements ne se déclenchent, assurez-vous que votre article contient une référence quelque part.

E.G. Je fait une classe de préchargement qui est appelée à partir de la ligne de temps de la racine à l'image 1 de commande:

new PreLoader(root); 

A ce stade, il n'y a pas de référence externe au préchargement, et tout _rootClip.loaderInfo.addEventListener (ProgressEvent.PROGRESS, fn) échouerait. (_rootClip est une propriété de ma classe PreLoader et sa racine est passée en paramètre). Ce que j'ai fait est simple: depuis que je fais un clip pour la barre de chargement, et j'ajoute ce MovieClip à la racine, ce MovieClip a une référence. Je viens de faire myMC.preloader = this; pour référencer mon préchargeur et empêcher la suppression de mes événements. Dès que j'ai terminé le préchargement, un simple _rootClip.removeChild(myMC); supprime tout :)

Questions connexes