Si bien en el capítulo dos del libro Flash Extremo desarrollé este tema con mayor profundidad, considero que vale la pena hacer una mención al mismo en el blog para comprender su funcionamiento y aportar un modo de adoptar una buena práctica a la comunidad de desarrolladores:
La sintaxis por medio de la cual agregamos eventos, es la siguiente:
addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown)
Al método addEventListener le indicamos en primer lugar el tipo de evento (MouseEvent.MOUSE_DOWN), y la función que se va a ejecutar en respuesta a dicho evento; en nuestro caso, la función onMouseDown.
Pero existen tres parámetros más, los cuales son de carácter opcional:
//addEventListener(evento, listener, useCapture, priority, weakReference)
addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown, false, 0, false)
El último de estos parámetros es el que nos interesa. Su valor por defecto es false. Al modificar este ultimo parámetro y definirlo como true, estamos indicando que dicho evento sea tenido en cuenta por el garbage collector (o recolector de basura) al realizar su rutina.
Ahora bien, ¿Qué es el garbage collector? El garbage collector, como su nombre lo indica, es un recolector de basura; es un proceso que se ejecuta detrás de escena dentro de una película swf, y se encarga de liberar memoria, eliminando aquellos objetos que ya no están siendo utilizados por la aplicación.
Para que el garbage collector “elimine” la referencia a aquellos eventos que ya no estamos utilizando, debemos asignar la referencia débil al declararlos. De aquí, el por qué del true del último parámetro:
addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown, false, 0, true)
De este modo, la próxima vez que el Garbage Collector recorra nuestra película, se va a encargar de eliminar la referencia de dicho evento y liberará espacio en memoria.
Esto es simplemente una buena práctica; acostumbrarse a escribir la sintaxis completa de un evento y asignar en true el parámetro weakReference, nos puede ayudar a eliminar problemas de memoria con nuestras aplicaciones. Se trata de un buen hábito fácil de incorporar y que en verdad es de utilidad en nuestros desarrollos.
NOTA 1: no hay ninguna forma de hacer que el garbage collector se ejecute; AS3 no provee sintaxis para ello. Cada determinado tiempo, este recorre la aplicación detrás de escena liberando memoria y eliminando aquellos listeners que han sido asignados para que el garbage collector los recoja.
NOTA 2: utilizar la referencia débil, NO es un reemplazo al método removeEventListener() ni mucho menos. Por el contrario, es más bien un complemento a este, o más bien, puede resultar de utilidad en caso de que olvidemos eliminar listeners.
Saludos!
Comments
Tomare en cuanta lo que dijiste y haré algunas pruebas para ver si puedo liberar memoria de una app que come memoria como loco.
Respecto a tu NOTA1, haz probado con System.gc()??
Saludos!
Mario, sí, estaba al tanto del método gs() de la clase System, pero es son bastante controversiales las opiniones al respecto. Personalmente, prefiero no utilizarlo y no forzar a pasar el GC. Soy partidario de que, con buenas prácticas y optimización del código, se puede evitar el uso de esta función, y hacer que las aplicaciones realmente rindan
un abrazo!
Make