actionscript-3 - 在 ActionScript 中将匿名函数用作事件处理程序-好还是不好?

标签 actionscript-3 event-handling anonymous-function

我是从JS世界来到AS3的,我应该承认匿名功能是我的弱项。我倾向于在各处使用它们。现在,在进入AS3时,我已经在很多地方听到和阅读过,AS和Flash在处理垃圾收集方面非常糟糕,应该手动清空,处置和删除所有事件处理程序和对象,以避免奇怪的和无法解释的内存泄漏以及崩溃。不知道这部分内容是正确的,但是我想从一开始就遵循最佳实践。

所以我的问题是-将匿名函数用作事件处理程序的想法有多糟糕?例如考虑这样的代码:

addEventListener(Event.ENTER_FRAME, function() : void {
    controls.elapsed = stream.time;
});

contorls.elapsed 是 setter ,除了设置视频播放器的当前播放时间之外,还更新整个UI,并且是NetStream对象,用于流传输实际视频。

在很多其他地方,匿名功能可以使代码更简洁,更直观。检查以下代码以获取控制栏的简单淡入效果:
public function showControls() : void
    {
        var self:Controls = this;

        if (!visible) {
            visible = true;
            fadeTimer = new Timer(30, 10);
            fadeTimer.addEventListener(TimerEvent.TIMER, function() : void {
                self.alpha += 0.1;
            });
            fadeTimer.addEventListener(TimerEvent.TIMER_COMPLETE, function() : void {
                self.alpha = 1;
            });
            fadeTimer.start();
        }
    }

我完全喜欢它的外观并适合代码,但我担心泄漏。尽管Event.ENTER_FRAME处理程序以这种形式可能永远不会有害,但计时器监听器呢?我应该手动删除那些监听器,还是将它们设置为 fadeTimer = null 后会自动删除?是否可以完全删除具有匿名功能的监听器?

最佳答案

在可行的地方使用函数方法没有什么错。就内存泄漏而言,您需要将对象跟踪到舞台上以查看是否可以将其删除。

向控件中添加ENTER_FRAME事件处理程序可确保控件具有对匿名函数的引用。由于代码是控件的一部分(或出现在控件中),这很好,因为当控件处于控件中时,匿名函数将被删除。

向计时器添加事件处理程序可确保计时器具有对匿名函数的引用。如果计时器正在运行,它将使匿名函数引用保持 Activity 状态,并通过关联使enture控件保持 Activity 状态。但是,一旦计时器停止,则应同时收集计时器和功能。

如果其他所有方法均失败,请使用探查器并查看! ;)

关于actionscript-3 - 在 ActionScript 中将匿名函数用作事件处理程序-好还是不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4421060/

相关文章:

php - 如何在PHP中定义一个带参数且不闭包的回调并使用?

JavaScript 从匿名函数中读取私有(private)变量

actionscript-3 - 在 AS3 中创建自定义 trace() 类

JavaScript "Don´t change states to fast"

actionscript-3 - Away3D (4.x broomstick) 如何将对象的全局位置转换为局部位置?

c# - 具有多个控件的 winform 中的事件处理

android MediaStore.Audio.Media.RECORD_SOUND_ACTION : no activity found to handle intent

javascript - 删除自执行匿名函数

actionscript-3 - 有没有办法使用 AS3 导出 PSD

actionscript-3 - AS3 错误 : '1172: Definition fl.controls:Button could not be found.'