2009-02-25 131 views
1

我在Flash和as3中构建动画,我有一个函数可以添加舞台 eventListener,stage.addEventListener(Event.ENTER_FRAME,setScrollPercent,false,0,真正);flash AS3我如何删除舞台事件监听器

由于这个事件是在一个函数的函数里面设置的,所以“两个函数很深”,我怎样才能从函数外部重置所有的舞台事件监听器而不会出错?

回答

5

最佳实践与AS事件监听器有:

  • 让它弱(如你所做的,使用addEventListener的最后一个参数)
  • 将事件侦听器后空处理(严格来说不需要,如果你把它设置为弱)

Flex不会给你析构函数。它拥有自己的垃圾收集器,在后台管理内存。一旦没有对它的引用,它会清理一段内存。那么,强烈的参考。所有对象默认都有很强的参考。事件处理程序,因为它们往往是一个性能瓶颈,具有这种宣称自己很弱的特殊能力 - 一个弱点的参考。这当然只有当您使用addEventHandler()函数附加事件处理程序时才有可能。 GC没有考虑到弱引用,因此,当所有强引用都消失时,它们将自动收集垃圾,从而使您免于手动执行=null的紧张局势。当你不指定参数时,你会做什么。默认情况下,即使处理程序被创建为强引用。

但是,标记它们弱有副作用。没有你知道它们,它们会消失在稀薄的空气中。最终,你会知道,但是就一个讨厌的bug而言。那是什么导致你的问题?也许,可能不是。你必须尝试。此外,如果您可以向我们提供更多详细信息(如确切的错误代码,某些来源),它将有所帮助。

希望这会有所帮助。快乐的弯曲:)

+0

你可以添加一个例子吗?我是AS3的新手,我真的不知道弱点是什么。 – 2009-02-25 14:34:24

1

你看到了什么错误?嵌套级别不应该与它有任何关系,因为监听器只是通过参数进行注册,所以只要您使用与用于添加的相同的三个关键参数调用remove,您应该没问题。

你真正的问题是如何获得对外部范围的侦听器对象的引用?如果是这样,有几种可能的解决方案,最好的方法取决于你的代码结构。

- MarkusQ

0

你的问题的答案,我意识到你有一个范围的问题,因为我刚刚回答了一个问题,你的范围,是你正在与舞台。考虑全局舞台,因为它是绘制所有显示对象的画布。

以下将在任何地方工作!

stage.addEventListener(Event.ENTER_FRAME, setScrollPercent, false, 0, true); 

现在,你在说什么,即时猜测错误,就是你只设置上面removeEventListener当你已准备好,将无法正常工作。

removeEventListener函数不接受像它的同级addEventListener这样的五个参数,它只允许三个忽略优先级和弱引用,如下所示。

//The following removes YOUR stage Event.ENTER_FRAME listener from any scope. 
stage.removeEventListener(Event.ENTER_FRAME, setScrollPercent, false); 

希望这会有所帮助,请记住这个阶段是在一定意义上的全球根,小心根,它的实际工作就应该是怎样,现在的事实,呼吁根现在是相对于SWF你从阶段开始,而不是阶段,除非阶段是当前范围的根。

0

你应该能够使用你的旧功能,并使用removeEventListeners而不是添加。其实很简单。