声明的ActionScript 3文档flash.utils.setTimeout
:
如果不调用该
clearTimeout()
函数取消setTimeout()
调用,则不会对包含set timeout closure函数的对象进行垃圾回收.
这听起来很荒谬.没有理由它应该保持对函数/闭包的引用,它永远不会再次调用,并且等效的JavaScript函数不会泄漏内存.
这是真的?
至少在当前版本的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
编辑.f
setTimeout