我继承了一个庞大的遗留Flex项目,而且我越深入到代码中,我就越关注自己。例如,我正在查看"窗口的代码"在应用程序中键入图像查看器。每次显示时,都会添加下面的eventListeners,并且永远不会删除。
由于这些是强引用并且从未被删除,这是一个问题,但是重复添加eventListeners让我暂停。 "窗口"可以在应用程序的生命周期中多次显示和隐藏。
我的问题:这是否意味着 n =(4 *显示的次数)eventListeners? (...颤动)。
这是一个在预算紧张的情况下进行的巨大项目修订,所以我试图确定我是修复这种事情还是放手。
addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler);
addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);
addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
答案 0 :(得分:2)
如果他们是不同的 eventlisteners,他们将被多次添加。如果它们都引用相同的函数,则每次都会覆盖它,只调用一次特定的函数。
尝试以下简短示例,看看我的意思:
var s:Sprite = new Sprite(); //some sort of displayobject with EventDispatcher capabilities
s.addEventListener(MouseEvent.CLICK, onClick);
s.addEventListener(MouseEvent.CLICK, onClick);
function onClick(e:MouseEvent):void{
trace("hey");
}
按下Sprite会给你一个控制台输出"嘿"而不是两个"嘿" s。 现在考虑以下内容:
var s:Sprite = new Sprite();
s.addEventListener(MouseEvent.CLICK, onClick);
s.addEventListener(MouseEvent.CLICK, onClick2);
function onClick(e:MouseEvent):void{
trace("hey");
}
function onClick2(e:MouseEvent):void{
trace("sup");
}
这会给你输出"嘿"和" sup"一旦你按下精灵。
如果你真的担心,你可以给事件监听器一个弱引用。我不知道你正在研究的项目有多复杂,但是实现一些东西可以立刻摆脱所有的事件恶习(比如,等待Event.REMOVED_FROM_STAGE,然后手动删除监听器)不应该这样做。太过时间了。