actionscript-3 - ejemplos - codigos actionscript 3.0 para flash
Actionscript 3: ¿Los oyentes de eventos propios evitan que un objeto sea recolectado como basura? (2)
No pero.
Se supone que el recolector de basura AVM2 encuentra objetos inalcanzables. Pero debido a que la recolección de basura no es determinista, es muy difícil confiar o incluso probar este comportamiento, es posible que el recolector de basura funcione a la perfección, pero sin molestarse en ejecutar la marca y el barrido, ya que tiene suficiente RAM libre .
Es una buena idea eliminar los detectores de eventos cuando haya terminado con el objeto , incluso si provienen del propio objeto (es decir, referencias circulares). ¿Por qué es esta una buena idea? Porque nunca se sabe cuándo se ejecutará el recolector de basura . Si desea un comportamiento determinista, siempre elimine los oyentes de manera determinista, especialmente para eventos sensibles al tiempo como TIMER y ENTER_FRAME; de lo contrario, está creando una condición de carrera entre los oyentes en ejecución y el recolector de elementos no utilizados. El recolector de basura solo se ejecuta periódicamente.
En general, si desea adjuntar detectores de eventos sin crear una referencia adicional al objeto, pase true al parámetro useWeakReference
de addEventListener()
. Sin embargo, si desea dejar de recibir los eventos de inmediato, deberá desconectar manualmente los detectores de eventos tan pronto como haya terminado con el objeto.
Sé que los detectores de eventos y las referencias a un objeto evitarán que el recolector de basura se ocupe de los objetos. Mi pregunta es, ¿un detector de eventos ubicado en un objeto, escuchando el mismo objeto, evitará que ese objeto sea recolectado?
Lo pregunto porque parece que esto me está sucediendo a mí. Estoy rompiendo todas mis referencias a un objeto, pero todavía estoy viendo rastros cuando se apaga el temporizador. Al mismo tiempo, parece que esto no debería impedir la recopilación porque crearía una memoria asignada pero irrelevante.
Sí, esto impedirá que el GC limpie su objeto. Una forma ingeniosa de tratar de evitar esto es usar referencias débiles al agregar oyentes.
myobj.addEventListener(Event.EVENT, eventHandler, false, 0, true);
La última bandera verdadera establecerá que el oyente use una referencia de objeto débil.
La mejor práctica sería realizar un seguimiento y siempre eliminar cualquier oyente activo antes de anular su objeto.
Echa un vistazo a esta gran publicación de blog para obtener más información sobre este tema
http://gskinner.com/blog/archives/2006/06/as3_resource_ma.html