我正在flash和as3中构建动画,我有一个功能,我在其中添加一个舞台 eventListener,stage.addEventListener(Event.ENTER_FRAME,setScrollPercent,false,0,true);
由于此事件是在函数函数内设置的,“两个函数深度”,如何从函数外部重置所有阶段事件侦听器而不会出现错误?
答案 0 :(得分:5)
AS eventlisteners的最佳做法是:
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。实际上非常简单。