当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如果没有调用clearTimeout(),flash.utils.setTimeout()是否会泄漏内存?》经验,为你挑选了1个好方法。

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

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

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

这是真的?



1> 小智..:

至少在当前版本的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的显式引用时,内存使用在几分钟内上升到许多千兆字节.文档已过时.Flash不会保留对传递给的闭包的引用setTimeout.(至少在OS X上;我认为它在Windows上是相同的.)

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

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有