4

声明的ActionScript 3 文档flash.utils.setTimeout

如果不调用该clearTimeout()函数取消setTimeout()调用,则包含设置超时关闭函数的对象将不会被垃圾回收。

这听起来很荒谬。没有理由它应该持有对它永远不会再次调用的函数/闭包的引用,并且等效的 JavaScript 函数不会泄漏内存

这是真的?

4

1 回答 1

5

这不是真的,至少在当前版本的 Flash 中是这样。

我创建了一个函数,它创建一个大字符串,创建一个引用它的闭包,然后setTimeout用闭包调用。

public function tick():void {
    var data:String = "helloworld";
    for (var j = 0; j < 20; j++) {
        data += data;
    }

    var f = function() {
        var i = 0;
        if (data.length > 0) {
            i++;
        }
    };

    setTimeout(f, 0);
}

我非常频繁地运行此功能,并使用System.totalMemory(以及 OS X 活动监视器)来监视 Flash 的内存使用情况。

function Main():void {
    setInterval(tick, 10);
    setInterval(display, 500);
}

public function display():void {
    trace("Memory usage: " + System.totalMemory + "B.");
}

内存使用量会短暂上升,但随后会随着垃圾收集器的加入而回落。平均内存使用量在几分钟内保持稳定。

当我修改代码以保持对每个闭包1的显式引用时,内存使用量在几分钟内上升了许多 GB。文档已过时。Flash 不保留对传递给的闭包的引用setTimeout。(至少在 OS X 上;我认为在 Windows 上是一样的。)

1我创建了一个 Array 作为静态类 var 并pushf调用setTimeout.

于 2013-05-10T19:29:28.477 回答