ActionScript 3 documentation for flash.utils.setTimeout
声明:
如果不调用
clearTimeout()
函数取消setTimeout()
调用,则不会对包含set timeout closure函数的对象进行垃圾回收。
这听起来很荒谬。没有理由它应该保持对它永远不会再调用的函数/闭包的引用,the equivalent JavaScript functions do not leak memory。
这是真的吗?
答案 0 :(得分: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 的显式引用时,内存使用量在几分钟内就会增加到几千兆字节。文档已过时。 Flash不会保留对传递给setTimeout
的闭包的引用。 (至少在OS X上;我认为它在Windows上是相同的。)
1 在调用push
之前,我创建了一个数组作为静态类var并f
编辑每个setTimeout
。 子>