我有一个 FileReference 对象数组,每个对象都有几个监听器,我应该在它的处理程序方法中删除每个监听器,还是应该在完整的处理程序中将它们全部删除?
我在某处读到为听众使用弱引用,但我认为明确删除听众会更好(是?/否?)
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);
}
最佳答案
当你不再需要它们时,明确地删除你的听众总是一个好主意,是的,你这样做的方式很好。这可能看起来有点冗长,但它仍然是一个很好的做法,它让您养成知道听众在哪里的习惯,因为不知道经常会导致泄漏和意外行为。
至于 useWeakReference,除了移除不需要的监听器之外,我几乎总是自己使用它。对我来说,它已成为规则而不是异常(exception)。但是,如果您必须选择一个,请明确删除您的听众。不过,就我个人而言,我两者都做。
事实上,我发现最好将 useWeakReference 设为 false 的次数特别少,因为这样做会阻止对象被垃圾回收。确实,在我了解该参数的用途之前 ( blog post here ),在获取源自 Flex 框架调用组件的运行时异常后,我花了大量时间挠头,我确信我已从显示列表中删除。
Deepa Subramaniam 在 her component-model talk 中斜着提到了它在去年的 MAX session 上(非常值得一看的精彩演讲);我相信她的说法类似于,“我不知道为什么 Flash 播放器团队选择将 false 作为默认值而不是 true,但是在 99% 的情况下,您会想要将该值设置为真的。”
关于apache-flex - 弹性/AS3 : When to remove listeners?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/476813/