2014-12-05 13 views
1

我已经继承了一个大型的传统Flex项目,并且我深入了解代码,我越来越担心。例如,我正在查看应用程序中的“窗口”类型图像查看器的代码。每次显示时,下面的eventListeners都会被添加并且不会被删除。添加具有相同参数的eventListener为null /替换以前的eventListeners吗?

由于这些是强引用,并且从不删除,这是一个问题,但是这种重复添加eventListeners的操作让我暂停。 “窗口”可以在应用程序的生命周期中多次显示和隐藏。

我的问题:,这是否意味着是有ñ =(4 *次数显示)事件监听器? (...不寒而栗)。

这是一个庞大的预算紧张的项目修订,所以我试图确定我是否解决了这类问题或只是放开它。

addEventListener(MouseEvent.MOUSE_OVER, mouseOverHandler); 
addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler); 
addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 
addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 

回答

2

如果他们不同事件监听器,它们将被添加多次。如果它们都指向相同的函数,则每次都会被覆盖,只调用一次特定的函数。

请尝试以下简单的例子,看看我的意思是:

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

按压雪碧会给你的“哎”,而不是两个“哎” 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然后手动删除侦听器)不应该太耗费时​​间。

+0

谢谢 - 是的,我的意思是添加相同的eventListeners - 所以至少不会有无数的孤儿eventListeners。我可以通过并做弱refs,但有** lot **的类,等等。你知道如果调用removeEventListener为一个不存在的eventListener会抛出一个错误? – 2014-12-05 13:42:22

+0

它不应该,但是如果你想确定,你可以在它前面放置一个if条件的'hasEventListener(type:String)'。 – DodgerThud 2014-12-05 13:46:35

+0

根据我的经验,在某些情况下,相同的侦听器也会堆叠,堆栈侦听器最显着的事件是'Event.ENTER_FRAME'。 – Vesper 2014-12-05 13:51:10

相关问题