2014-01-07 57 views
0

假設有一個類加載一堆圖像並在完成時調度Event.COMPLETE。我們叫它AssetLoaderActionscript中的垃圾收集匿名函數

然後我們有我們的主文檔類,它確實是這樣的:

var myAssetLoader:AssetLoader = new AssetLoader(); 
    myAssetLoader.addEventListener(Event.COMPLETE, function():void { 
    doStuffWithImages(); 
    }); 

    myAssetLoader.loadURLS("http://example.com/image1.png", "http://example.com/image2.png"); 

    //Some time later, after doStuffWithImages() 
    myAssetLoader = null 

將myAssetLoader完全被垃圾回收?即沒有任何removeEventListener?

回答

1

您應該在removeEventListener之前將引用設置爲null。

  • 刪除對象的所有引用以確保觸發垃圾回收。
  • 將對顯示對象的引用設置爲null不能確保對象被凍結。對象繼續消耗CPU週期,直到它被垃圾收集爲止。 確保在將其引用設置爲空之前正確停用對象。
  • 如果一個對象被用作事件監聽器,另一個對象可以引用它。如果是這樣,在將參考設置爲空之前,使用removeEventListener()方法刪除事件偵聽器。
+0

謝謝,但這並沒有真正回答這個問題。沒有其他對象真正引用myAssetLoader,所以問題是如果事件偵聽器仍然在內存中徘徊,並且無論該偵聽器是否爲匿名函數,都會產生影響。我已經編輯了上述內容來澄清一點。 – davidkomer

1

在這種情況下,是的,您的AssetLoader將被垃圾收集。事件處理程序是否是匿名函數。

關鍵是要注意哪個對象在添加事件偵聽器時維護對另一個對象的引用:當您說a.addEventListener(「event」,b.eventHandlerFunction)時,「a」對象維護對「b」對象(事件發生時「a」需要執行「b」中的事件處理程序)。

所以,如果我們丟棄「a」,並在內存中保留「b」,則可以對垃圾收集進行垃圾收集,因爲沒有對象會引用它。在你的情況下,「b」是匿名函數所屬的主文檔類,而「a」是AssetManager。

這就是說,在其他答案中給出的建議仍然是好的做法,即使你知道你的對象會得到g/c'd。