声明的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
| 归档时间: |
|
| 查看次数: |
3108 次 |
| 最近记录: |