Apache flex Flex/AS3:何时删除侦听器?

Apache flex Flex/AS3:何时删除侦听器?,apache-flex,actionscript-3,Apache Flex,Actionscript 3,我有一个FileReference对象数组,其中每个对象都有几个侦听器,我应该在它的处理程序方法中删除每个侦听器,还是应该在完整的处理程序中删除它们 我在某个地方读到过使用弱引用作为侦听器的内容,但我认为最好是显式删除侦听器(是?/否?) 当你不再需要你的听众时,明确地删除他们总是一个好主意,是的,你这样做的方式很好。这可能看起来有点冗长,但这仍然是一个很好的做法,它让你养成了知道听众在哪里的习惯,因为不知道往往会导致泄密和意外行为 至于useWeakReference,除了删除不需要的侦听器之

我有一个FileReference对象数组,其中每个对象都有几个侦听器,我应该在它的处理程序方法中删除每个侦听器,还是应该在完整的处理程序中删除它们

我在某个地方读到过使用弱引用作为侦听器的内容,但我认为最好是显式删除侦听器(是?/否?)


当你不再需要你的听众时,明确地删除他们总是一个好主意,是的,你这样做的方式很好。这可能看起来有点冗长,但这仍然是一个很好的做法,它让你养成了知道听众在哪里的习惯,因为不知道往往会导致泄密和意外行为

至于useWeakReference,除了删除不需要的侦听器之外,我几乎总是自己使用它。对我来说,这已成为惯例,而不是例外。但是,如果必须选择一个,请明确删除侦听器。但就我个人而言,我两者都做

事实上,我发现最好将usewakreference保留为false的情况尤其少见,因为这样做可以防止对象被垃圾收集。事实上,在我了解该参数的意义()之前,我花了大量时间在Flex框架引发的运行时异常后挠头,对我确定已从显示列表中删除的组件进行调用


Deepa Subramaniam在去年的MAX会议上间接提到了这一点(这是一次非常值得一看的精彩演讲);我相信她是这样说的,“我不知道为什么Flash player团队选择将默认值设为false而不是true,但99%的情况下,您会希望将该值设置为true。”

如果您要向DisplayObject添加对象,我建议在触发Event.REMOVED\u FROM\u STAGE Event时删除侦听器,并在添加到舞台时添加它们。这是一种确保删除侦听器的简单方法,它需要显式地调用您编写的RemovelListeners函数。例如,在您的代码段中,如果加载失败,则侦听器将永远不会被删除。

您的博客文章很有帮助,请也查看MAX talk,谢谢。
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);
 }