web-dev-qa-db-fra.com

Comment supprimer / gc un objet dans ActionScript 3?

Je veux supprimer/forcer la collecte des ordures sur une instance de classe de l'intérieur lui-même. Évidemment, this = null et delete this ne fonctionne pas. Est-ce de quelque manière que je puisse faire cela, ou je suis en train d'aboyer le mauvais arbre? Je suis essentiellement à la recherche d'un destructeur de quelque sorte ..

J'ai une instance de classe qui tente de charger un fichier XML et si le fichier n'est pas trouvé, je souhaite détruire l'instance, de préférence de l'intérieur lui-même. Le but est alors de faire certaines choses dans la classe mère selon que l'instance enfant est nulle ou non.

J'ai pensé à lancer un événement au parent et à supprimer l'enfant de là, mais je préférerais faire cela que s'il n'y a pas d'autre moyen.

20
evilpenguin

Vous ne devriez pas essayer de supprimer l'objet de lui-même - c'est une mauvaise pratique et dans AS3, vous ne pouvez pas le faire à coup sûr.

Objet peut être supprimé (i.e. déchets collectés) uniquement s'il n'y a pas de références à cet objet. Étant donné que les références sont toujours transmises par la valeur et l'objet ne sont généralement pas au courant des références à celle-ci, vous ne pouvez pas supprimer l'objet de lui-même. La seule chose utile que vous puissiez faire est de créer une méthode qui nettoie toutes les ressources utilisées par une instance. Une telle méthode servira de destructeur, mais vous devrez l'appeler manuellement. N'oubliez pas que les auditeurs d'événements empêchent également la collecte des ordures à moins que vous ne les supprimiez.

Il y a aussi une différence entre delete 'ing à une propriété et la définit à null. Efficacement delete supprimera une propriété d'une instance de classe dynamique. Alors que définir la valeur de la propriété sur null ne supprime pas la propriété, mais effacez toute référence qui y était stockée. Par conséquent, les deux actions détruiront la référence qui a été stockée dans certaines biens. Remarque, que vous ne pouvez pas delete un objet, seulement une propriété.

Certains hacks peuvent être utilisés pour initier la collecte des ordures dans les joueurs flash 9 et les plus âgés. Cependant, récemment System.gc() appel est disponible, qui fait la même chose. Notez que vous ne pouvez pas vraiment compter sur le fait que GC sera réellement appelé. Ceci appartient au lecteur Flash.

retour à votre question: lancer un événement et notifier le parent que quelque chose a mal tourné est une bonne idée. Vous devriez vous en tenir à elle. De plus, il est préférable que le parent sache de cette façon de cette façon, et non quand il découvrira que certaines propriétés ont été annulées comme par magie.

P.S.: Lecture Skinner Skinner Articles à la mémoire Dans Flash Player est en fait une bonne idée.

22
dragonfly

Si l'objet a été ajouté à un DisplayContainer à l'aide de la méthode AddChild (), vous pouvez supprimer l'objet du conteneur de l'objet à l'aide de parent.reMovechild (this). S'il n'y a pas de références à l'objet à gauche après cela, il sera ramassé par le collecteur des ordures.

Le seul problème est que lorsque vous avez des auditeurs d'événements dans l'objet, que vous pouvez élever manuellement ou laisser le collecteur à la poubelle le fera pour vous en définissant une faiblesseFerence = VRAI sur tous les auditeurs.

5
Lankaras Loerepoot

Vous devriez avoir une lecture sur la collection de déchets d'abord, subventions à ce sujet:

http://www.gskinner.com/blog/archives/2006/06/AS3_RESOURCE_MA.HTML

Le but n'est pas de définir la classe elle-même sur NULL, mais supprimez toutes ses références, y compris les auditeurs. Une fois que c'est complètement orphelin, les orphelins peuvent le ramasser à un moment donné.

Exemple de base:

// References a newly created Sprite
var reference:Sprite = new Sprite();

// Removes the reference, the Sprite is now orphaned and will probably be garbage collected within some seconds.
reference = null;

Une bonne pratique consiste à créer systématiquement une méthode de "destruct 'sur toutes vos classes qui supprime toutes ses références internes, dispose de bitmaps, supprime les auditeurs d'événements, etc., vous devrez ensuite vous inquiéter de dissuader les personnes externes.

Si vous utilisez Flex Builder, vous pouvez utiliser le profileur afin de visualiser la façon dont Flash Player gère tout cela en interne.

1
Theo.T

AS3 ne vous donne aucun destructeurs. Le mieux que vous puissiez faire est de définir toutes les références à null _ et de conserver vos doigts croisés - que le GC le remarquera et libérera la mémoire.

1
dirkgently
System.gc()
// Forces the garbage collection process. 

Référence:

http://livedocs.adobe.com/flash/9.0/actionscriptlangrefv3/flash/system/system.html

1