2010-11-22 82 views
0

我會盡量簡潔。我公司擁有一批對象中的數組,我申請事件監聽器每一個使用閉包:什麼會導致事件處理關閉停止工作?

//reduced to the logic in question: 
buttons.forEach(function(button:EventDispatcher, i:int, list:Array):void { 
    button.addEventListener(MouseEvent.MOUSE_OVER, function(e:Event):void { 
    button.filters = [button_glow_filter]; 
    }); 
}); 
//button-specific click handlers: 
buttons[0].addEventListener(MouseEvent.MOUSE_CLICK, handle_some_action); 

這完全適用了一會兒,直到我執行的UI無關的動作。這是一個非常複雜的系統,所以我不確定發生了什麼。我可以確認這個不相關的動作對包含按鈕或按鈕本身的對象沒有直接影響(至少,它不會通過公共接口改變任何東西)。按鈕仍然存在,並且點擊事件偵聽器仍然正常工作,因爲它們是在類的接口上單獨分配的實際功能。

因此,我的問題是:是否有人知道什麼可能導致這些閉包停止處理MouseOver事件,而不會對相關對象產生任何其他可察覺的影響?

有很多方法可以完成這個MouseOver行爲,現在我已經切換到了一個可行的方法,但我仍然想知道這個問題的答案以備將來參考。

回答

1

我發現幾乎立即發佈後可能的罪魁禍首:垃圾收集。花了幾分鐘才確認。這正是useWeakReference參數在addEventListener接口中的用途;它默認爲true。通過將其設置爲false,可以防止以此方式分配的監聽器被垃圾收集。 正確的代碼是:

buttons.forEach(function(button:EventDispatcher, i:int, list:Array):void { 
    button.addEventListener(MouseEvent.MOUSE_OVER, function(e:Event):void { 
    button.filters = [button_glow_filter]; 
    }, false, 0, false); 
}); 
+3

`useWeakReference`默認爲false。聽起來你可能會遇到GC問題,但我懷疑不明確傳遞「false」是罪魁禍首。 – 2010-11-22 21:13:46

相關問題