2013-05-10 53 views
4

ActionScript 3 documentation for flash.utils.setTimeout声称:如果未调用clearTimeout(),flash.utils.setTimeout()是否会泄漏内存?

如果不调用clearTimeout()功能取消setTimeout()呼叫,包含设置的超时closure函数的对象不会被垃圾收集。

这听起来很荒谬。没有理由认为它应该引用一个函数/闭包,它永远不会再次调用,并且the equivalent JavaScript functions do not leak memory

这是真的吗?

回答

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(以及Mac OS X的活动监视器)来监视闪存的内存使用情况。

function Main():void { 
    setInterval(tick, 10); 
    setInterval(display, 500); 
} 

public function display():void { 
    trace("Memory usage: " + System.totalMemory + "B."); 
} 

内存使用量会短暂上升,但随后因为垃圾收集跳下去会回落下来,平均内存使用稳定用几分钟的时间。

当我修改代码以保持对每个闭包的明确引用时,内存使用量在几分钟内上升到很多千兆字节。文档已过时。 Flash不保留对传递给setTimeout的封闭的引用。 (至少在OS X;我假定这将是在Windows相同)

我打电话setTimeout之前创建数组作为一个静态类var和push ED每个f到其上。