什么可能导致事件处理关闭停止工作?

时间:2010-11-22 20:40:40

标签: flex actionscript-3 actionscript

我会尽量简洁。我在数组中有许多对象,我正在使用闭包对每个对象应用事件监听器:

//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 个答案:

答案 0 :(得分:1)

我在发布垃圾收集后几乎立即想出了可能的罪魁祸首。只用了几分钟就确认了。这正是useEakReference参数在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);
});