flash AS3如何删除舞台事件监听器

时间:2009-02-25 05:15:14

标签: flash actionscript-3

我正在flash和as3中构建动画,我有一个功能,我在其中添加一个舞台 eventListener,stage.addEventListener(Event.ENTER_FRAME,setScrollPercent,false,0,true);

由于此事件是在函数函数内设置的,“两个函数深度”,如何从函数外部重置所有阶段事件侦听器而不会出现错误?

4 个答案:

答案 0 :(得分:5)

AS eventlisteners的最佳做法是:

  • 使它变弱(正如你所做的那样,是addEventListener的最后一个参数)
  • 处理后将事件侦听器设置为null(严格来说,如果将其设置为弱则不需要)

Flex不会给你析构函数。它有自己的垃圾收集器在后台运行管理内存。一旦没有对它的引用,它就会清理一块内存。好吧,强有力的参考。默认情况下,所有对象都具有强引用。事件处理程序,因为它们往往是性能瓶颈,具有声明自己弱的特殊能力 - 弱参考。当然,只有在使用addEventHandler()函数附加事件处理程序时才可以这样做。 GC没有考虑弱引用,因此,当所有强引用都消失后,它们将被自动垃圾收集,使您免于必须手动执行=null的紧张。当您未指定参数时,您将执行此操作。默认情况下,甚至将处理程序创建为强引用。

但是,标记它们较弱会产生副作用。它们可以在你不知道的情况下消失在空气中。最终,你会知道,但就一个讨厌的bug而言。这是什么导致你的问题?也许,可能不是。你必须要做实验。此外,如果您能为我们提供更多详细信息,例如确切的错误代码,某些来源,这将有所帮助。

希望这会有所帮助。快乐屈服:)

答案 1 :(得分:1)

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

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

- MarkusQ

答案 2 :(得分:0)

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

以下内容适用于任何地方!!!

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

现在,您所谈论的错误,即IM GUESSING,您只是在准备好时将上面的内容设置为removeEventListener,这将无效。

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

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

希望这会有所帮助,记住那个阶段在某种意义上是全局根,并且要小心root,它实际上是如此,因为调用root现在相对于你调用它的swf,不是舞台,除非舞台是当前范围的根源。

答案 3 :(得分:0)

您应该只能使用旧函数并使用removeEventListeners而不是add。实际上非常简单。