2009-01-24 7 views
8

Tengo una matriz de objetos FileReference que tienen varios oyentes conectados a cada uno de ellos, ¿debería eliminar cada oyente en su método de manejo, o debería eliminarlos todos en el controlador completo?Flex/AS3: ¿Cuándo eliminar oyentes?

He leído en alguna de utilizar referencias débiles para los oyentes, pero yo creo que sería mejor para eliminar explícitamente oyentes (sí?/No?)

for each(var f:Object in fileCollection){ 
    var myFile:FileReference = f.file; 
    myFile.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, onUploadCompleteData) 
    myFile.addEventListener(ProgressEvent.PROGRESS, onProgress); 
    myFile.addEventListener(IOErrorEvent.IO_ERROR, onError); 
    myFile.addEventListener(Event.COMPLETE, onComplete); 
} 

private function onUploadCompleteData(e:DataEvent):void{ 
    // doin my thing here 
    removeListeners(e) 
} 

private function removeListeners(e:Event):void{ 
    var myFile:FileReference = FileReference(e.target) 
    myFile.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA, onUploadCompleteData) 
    myFile.removeEventListener(ProgressEvent.PROGRESS, onProgress); 
    myFile.removeEventListener(IOErrorEvent.IO_ERROR, onError); 
    myFile.removeEventListener(Event.COMPLETE, onComplete); 
} 

Respuesta

9

Es siempre una buena idea para eliminar sus oyentes de forma explícita cuando ya no los necesites, sí, y la forma en que lo haces está bien. Puede parecer un poco detallado, pero sigue siendo una buena práctica, y te mantiene acostumbrado a saber dónde están tus oyentes, ya que no conocer a menudo conduce a filtraciones y comportamientos inesperados.

En cuanto a useWeakReference, casi siempre lo uso yo mismo, además de eliminar los oyentes innecesarios. Para mí, se ha convertido en la regla y no en la excepción. Sin embargo, si tuviera que elegir uno, elimine sus oyentes explícitamente. Personalmente, sin embargo, hago ambas cosas.

De hecho, he encontrado el número de ocasiones en que sería mejor dejar uso de WeakReference falso, ya que hacerlo evitará que los objetos sean recolectados, es especialmente raro. De hecho, antes de saber para qué era ese argumento (blog post here), pasé mucho tiempo rascándome la cabeza después de recibir excepciones de tiempo de ejecución derivadas del framework Flex haciendo llamadas a componentes que estaba seguro que había eliminado de la lista de visualización.

Deepa Subramaniam lo mencionó oblicuamente en her component-model talk en la conferencia MAX del año pasado (una excelente charla que vale la pena consultar); Creo que la forma en que lo expresó fue algo así como: "No sé por qué el equipo de Flash Player eligió hacer que el valor predeterminado sea falso en lugar de verdadero, pero el 99% del tiempo, vas a querer establecer ese valor en cierto."

+0

La publicación de su blog fue útil, echó un vistazo a la charla MAX también, gracias. – Ronn

2

Si está agregando objetos a un DisplayObject, recomendaría eliminar los oyentes cuando se active el evento Event.REMOVED_FROM_STAGE y agregarlos cuando se agreguen a la etapa. Esta es una manera fácil de asegurarse de que los oyentes sean eliminados al tener que llamar explícitamente a la función removeListeners que usted escribió. Por ejemplo, en su segmento de código, si la carga falla, los oyentes nunca serán eliminados.

Cuestiones relacionadas