2011-11-07 47 views
0

我有一個關於AS3內存管理的問題我想知道有沒有人可以幫助我。AS3 - 內存管理

假設我創建了一類的實例變量,在這種情況下或類型的聲音:

public class SoundStore extends Sprite{ 

var s:Sound; 

然後各種類函數內我這個變量多次引用,每個我想在新的聲音加載時間:

s = new Sound(); 

我正確的認爲每次我創建一個新的聲音我會覆蓋以前分配的內存?

由於

回答

5

號AS3是一個垃圾回收的語言,其使用引用計數處置未使用的對象。

s變量在內部是一個指向包含Sound對象的內存塊的指針。每次你做s = new Sound() AS3將在內存中創建一個新的Sound對象,並將s指針設置爲該對象的地址。舊對象仍然存在於內存中。如果您沒有舊對象的引用,那麼垃圾收集器將在某個時刻處理對象,通常是下一輪收集。這意味着,在任何時間點,您都可能在內存中有多個Sound對象,這些對象未被引用,但仍在使用資源。垃圾收集器被設計用來週期性地遍歷所有分配的對象,並且如果沒有對它們的引用就將它們處理掉。

這是關於Flash/AS3中GC的一篇很好的文章:http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html

+0

OK謝謝。我知道我沒有對GC運行時的具體控制。 如果我做了以下這將幫助我的內存管理: 嘗試{s} =空; } catch(e:Error) {} s = new Sound(); – crooksy88

+2

編號將停止指向該聲音的實例,但它仍然會在那裏坐在內存中,直到整個應用程序中的其他任何內容都不指向它。 (除非'useWeakRefereces'設置爲true,否則這包括Events。 – WORMSS

+0

你可以調用'System.gc()'在Flash 10及更高版本中強制執行垃圾回收,但這是一個非常糟糕的主意。它完全影響了性能,甚至不能保證在調試之外做任何事情。 – Polynomial