2013-06-19 45 views
1

我實際上使用Loader類從遠程服務器獲取圖像。 我使用它是爲了工作,當它完成時,我將它從內存中移除,但是有一點泄漏。[AS3]內存泄漏用加載程序加載的壓縮圖像

要看到它,我正在使用偵察兵。在內存部分,位圖顯示對象是免費的,但圖像部分不是。

當我看看偵察文檔時,發現圖像部分是我加載的文件的壓縮版本。

我該怎麼做才能釋放這部分內存?

感謝

編輯2(_裝載機前忘了): 這裏是我做過什麼來釋放裝載機:

(_loader.content as Bitmap).bitmapData.dispose(); 
_loader.unload(); 
this.removeChild(_loader); 
_loader = null; 

編輯3: 我仍然需要幫助我的內存泄漏,謝謝

+0

您應該添加一個代碼示例。另外,你還記得在BitmapData上調用dispose()嗎? – RasmusWL

+0

如果這是你的實際代碼,你只是缺少一個下劃線:最後一行應該是'_loader = null;' – weltraumpirat

+0

抱歉,我複製代碼時犯的錯誤是正確的。它仍然沒有按照我的預期工作。 – bahamutdragoon

回答

0

使用Loader類時很容易出現內存泄漏。 對於垃圾收集器,以除去從所述存儲器中的對象下列規則必須應用:

  • 的對象沒有引用
  • 的對象沒有事件偵聽器(或事件偵聽器具有的WeakReference設置爲true)
  • 對象不包含在任何陣列

下面是使用Loader

var urlReq:URLRequest = new URLRequest("url here"); 

var l:Loader = new Loader(); 
l.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded); 
l.load(urlReq); 
的小例子

看起來很簡單,不是嗎? ;)我沒有包含處理程序,因爲這個例子並不重要。

現在讓我們將其刪除:

l.contentLoaderInfo.removeEventListener(Event.COMPLETE, onLoaded); 
//the LoaderInfo object is inside the Loader object, it needs to be free of listeners 
//or it won't let the Loader object to be garbage collected 

var content:DisplayObject = l.content; // save the loaded item 
l = null; // make object NULL 

現在裝載機應該在下次垃圾收集器運行的內存中刪除。只要確保你已經清除了所有的聽衆和參考。

希望有幫助!