2011-01-20 40 views
5

Últimamente me he encontrado constantemente escribiendo removeEventListeners en todas partes, lo que hace que el código sea bastante complicado. Sé que es una buena práctica y tal, pero en general no tiene sentido. El recolector de basura debería manejar una tarea tan simple en sí misma, ¿no es así? ¿Es tan difícil eliminar todos los oyentes automáticamente cuando el objeto se establece en nulo?Secuencia de comandos de acción: ¿Establecer un objeto como nulo elimina automáticamente todos los detectores de eventos adjuntos?

Así que solo quiero estar seguro si ese es el caso. ¿Establecer el objeto como nulo elimina automáticamente todos los detectores de eventos adjuntos?

¿Alguna idea sobre esto?

ACTUALIZACIÓN: En mi escenario es como esto - se crea un objeto y adjuntar montón de detectores de eventos a la misma, a continuación, después de un tiempo que necesito para volver a inicializar este objeto. Por supuesto, establecer este objeto como nulo es mucho más fácil que desvincular a cada oyente a mano. Y en la mayoría de los casos, los oyentes son funciones anónimas, lo que significa que no es posible sin la refacturación del código. Cuando simplemente vuelvo a inicializar una variable con new no obtengo oyentes duplicados y tal, pero no estoy seguro de que sea un valor anterior, junto con todos los oyentes se recogen basura. ¿Lo es?

+2

Casalib es un buen conjunto de clases que lo ayudarán a simplificar la recolección de basura. Útil para cuando tienes un montón de objetos de visualización. – redconservatory

+0

+1 para casalib - http://as3.casalib.org/docs/org_casalib_display_CasaMovieClip.html echa un vistazo a la función removeChildrenAndDestroy() – Daniel

Respuesta

4

No, no está configurando el objeto como nulo, sino el puntero que hace referencia a él. No será recogido por la recolección de basura a menos que no sea necesario en otras partes del programa, que incluye oyentes. Necesita eliminar todos los oyentes usted mismo, pero eso no debe impedir que encuentre una manera menos complicada de hacerlo, como un método dedicado de clearListeners, o una clase de ayuda, etc.

+0

A menudo trato de implementar una interfaz IDisposable para cada clase que construyo. Eso me obliga a ocuparme de implementar el código que facilitará el proceso de recolección de basura. – OXMO456

+0

por lo general, generalmente solicito la eliminación de todos los oyentes con un método de disposición pública(). – TheDarkIn1978

0

Creo que necesita utilizar una referencia débil cuando se asignan los oyentes y que el "anulado" debería ser suficiente.

+0

Esto debería funcionar siempre que lo limpie usted mismo y elimine todas las referencias al objeto. Además, en algunas situaciones, si no hace una referencia explícita al objeto, sería basura y presenta un comportamiento inesperado. – goliatone

+0

Las referencias débiles son un parámetro en la función 'addEventListener'. Por ejemplo, 'stage.addEventListener (Event.ENTER_FRAME, loop, false, 0, true);'. El parámetro final, 'true' es el parámetro' useWeakReference'. Siempre lo configuro en verdad. –

+0

¡las referencias débiles son engañosas! aprendí el hardway, pero afortunadamente Juan Pablo Califano publicó una explicación muy informativa a una pregunta previa mía sobre recolección de basura. por favor léalo: http://stackoverflow.com/questions/4200211/actionscript-forced-garbage-collection-not-working-in-adl – TheDarkIn1978

Cuestiones relacionadas