這是不正確的,至少在當前版本的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
到其上。