ActionScript 3 documentation for flash.utils.setTimeout
claim :
If you do not call the
clearTimeout()
function to cancel thesetTimeout()
call, the object containing the set timeout closure function will not be garbage collected.
这听起来很荒谬。没有理由它应该持有对永远不会再次调用的函数/闭包的引用,并且 the equivalent JavaScript functions do not leak memory .
这是真的?
最佳答案
这不是真的,至少在当前版本的 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 Activity Monitor)来监控 Flash 的内存使用情况。function Main():void {
setInterval(tick, 10);
setInterval(display, 500);
}
public function display():void {
trace("Memory usage: " + System.totalMemory + "B.");
}
内存使用量会短暂上升,但随着垃圾收集器的介入而回落。平均内存使用量在几分钟内保持稳定。
当我修改代码以保持对每个闭包的显式引用时,内存使用量在几分钟内上升到许多 GB。文档已过时。 Flash 不会保留对传递给
setTimeout
的闭包的引用。 . (至少在 OS X 上;我认为在 Windows 上也是一样的。)1 我创建了一个数组作为静态类 var 和
push
各编辑 f
在调用之前先了解一下 setTimeout
.
关于actionscript-3 - 如果不调用 clearTimeout(), flash.utils.setTimeout() 是否会泄漏内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16489536/