2009-01-24 96 views
8

我有一個FileReference對象的數組,每個都有幾個偵聽器,我應該刪除它的處理程序方法中的每個偵聽器,還是應該在完整處理程序中刪除它們?Flex/AS3:何時刪除監聽者?

我讀的地方使用了聽衆弱引用,但我認爲這將是最好明確刪除監聽器(是嗎?/否?)

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); 
} 

回答

9

它總是一個好主意,明確地刪除你的聽衆當你不再需要他們的時候,是的,你做事的方式很好。這看起來可能有點冗長,但這仍然是一個好習慣,它會讓你習慣於知道你的聽衆在哪裏,因爲不知道經常會發生泄漏和意外行爲。

至於useWeakReference,除了刪除不需要的監聽器外,我幾乎總是自己使用它。對我來說,這是成爲規則而不是例外。但是,如果您必須選擇一個,請明確刪除您的聽衆。儘管如此,我個人都這樣做。

事實上,我發現最好將useWeakReference設置爲false,因爲這樣做會阻止對象被垃圾收集,這種情況尤其少見。事實上,在我得知這個參數是什麼之前(blog post here),在得到來自Flex框架的運行時異常之後,我花了很多時間抓住了我的腦海,在組件上調用我確信我已經從顯示列表中刪除。

Deepa Subramaniam在去年的MAX會議上提到了her component-model talk(這是一個值得一看的好話題);我相信她所說的是這樣的:「我不知道爲什麼Flash player團隊選擇虛假而不是真實,但99%的時間,你想要設置該值真正。」

+0

您的博客文章是有幫助的,也檢查了最大的談話,謝謝。 – Ronn 2009-01-25 03:22:48

2

如果要向DisplayObject添加對象,建議在觸發Event.REMOVED_FROM_STAGE事件時刪除偵聽器,並在添加到舞臺時添加它們。這是一個簡單的方法,可以確保偵聽器被刪除,並明確地調用您編寫的removeListeners函數。例如,在您的代碼段中,如果加載失敗,那麼偵聽器將永遠不會被刪除。