2013-05-10 18 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到其上。