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

4
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作为静态类变量,并在调用setTimeout之前将每个f推入它中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接