如果没有调用clearTimeout(),flash.utils.setTimeout()是否会泄漏内存?

4 flash actionscript-3

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

如果不调用该clearTimeout()函数取消setTimeout()调用,则不会对包含set timeout closure函数的对象进行垃圾回收.

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

这是真的?

小智 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

public function display():void {
    trace("Memory usage: " + System.totalMemory + "B.");
}
Run Code Online (Sandbox Code Playgroud)

内存使用量会短暂上升,但随着垃圾收集器的进入,内存使用率会下降.平均内存使用量在几分钟内保持稳定.

当我修改代码以保持对每个闭包1的显式引用时,内存使用在几分钟内上升到许多千兆字节.文档已过时.Flash不会保留对传递给的闭包的引用setTimeout.(至少在OS X上;我认为它在Windows上是相同的.)

1我在调用之前创建了一个Array作为静态类var并在其上push编辑.fsetTimeout