2010-11-22 85 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

相关问题