flash AS3 如何删除舞台事件侦听器
Posted
技术标签:
【中文标题】flash AS3 如何删除舞台事件侦听器【英文标题】:flash AS3 how do I remove stage event listeners 【发布时间】:2010-10-09 17:53:42 【问题描述】:我正在用 flash 和 as3 制作动画,我有一个添加舞台的功能 eventListener, stage.addEventListener(Event.ENTER_FRAME, setScrollPercent, false, 0, true);
由于此事件设置在函数的函数内部,“深度两个函数”,如何从函数外部重置所有阶段事件侦听器而不会出现错误?
【问题讨论】:
【参考方案1】:AS 事件监听器的最佳实践是:
让它变弱(正如你所做的那样,addEventListener 的最后一个参数) 处理后将事件监听器设置为null(严格来说,如果设置为weak,则不需要)Flex 没有给你析构函数。它有自己的垃圾收集器在后台运行以管理内存。一旦没有对它的引用,它就会清理一段内存。好吧,强有力的参考。默认情况下,所有对象都具有强引用。事件处理程序,因为它们往往是性能瓶颈,所以有这种声明自己弱的特殊能力——弱引用。这当然只有在您使用addEventHandler()
函数附加事件处理程序时才有可能。 GC 不会考虑弱引用,因此,当所有强引用都消失时,它们将自动被垃圾收集,从而使您摆脱必须手动执行 =null
的压力。当您不指定参数时,您会这样做。默认情况下,即使处理程序也被创建为强引用。
但是,将它们标记为弱有副作用。他们可以在你不知道的情况下消失在空气中。最终,你会知道,但就一个讨厌的错误而言。这就是造成你问题的原因吗?也许,也许不是。你必须进行实验。此外,如果您能向我们提供一些更详细的信息,例如确切的错误代码、一些来源,将会有所帮助。
希望这会有所帮助。快乐的弯曲:)
【讨论】:
你能添加一个例子吗?我是 AS3 的新手,我真的不知道弱是什么意思。【参考方案2】:您看到了什么错误?嵌套级别应该与它无关,因为侦听器只是通过参数注册的,所以只要您使用与添加相同的三个关键参数调用 remove,就可以了。
您真正的问题是如何将侦听器对象引用到外部范围?如果是这样,有几种可能的解决方案,最好的方法取决于您的代码结构。
-- MarkusQ
【讨论】:
【参考方案3】:您应该能够只使用旧函数并使用 removeEventListeners 而不是 add。其实很简单。
【讨论】:
【参考方案4】:您的问题的答案,我意识到您在范围方面存在问题,因为我刚刚回答了您在范围方面的一个问题,即您正在使用舞台。考虑全局舞台,因为它是绘制所有显示对象的画布。
以下内容在任何地方都可以使用!!!
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);
希望这会有所帮助,请记住,stage 在某种意义上是全局根目录,并且要小心根目录,它实际上是按照现在应该的方式工作的,因为现在调用根目录是相对于你调用它的 swf 而言的,不是舞台,除非舞台是当前作用域的根。
【讨论】:
以上是关于flash AS3 如何删除舞台事件侦听器的主要内容,如果未能解决你的问题,请参考以下文章