2010-04-09 168 views
9

有人可以發佈一個as3代碼示例(特別是包含事件監聽器),這將是一個可能泄漏內存的簡單示例...也希望您可以發佈解決方案以顯示問題?AS3內存泄漏示例

現在的問題是:什麼是AS3事件監聽器中的內存泄漏的簡單示例,您如何解決它?

+0

這是一個功課問題或什麼? – davr 2010-04-09 16:45:12

+1

不,但我有點像一個哈哈......它的想法是在思考內存泄漏的時候有一個很好的'goto'的例子。這是一個很好的「反模式」。 – Skawful 2010-04-09 17:27:03

回答

7
public class MySprite extends Sprite { 

    public function MySprite() { 
     if(stage) { 
      init(); 
     } else { 
      addEventListener(Event.ADDED_TO_STAGE,init); 
     } 
    } 

    private function init(e:Event = null):void { 
     stage.addEventListener(Event.RESIZE,handleStageResize); 
    } 

    private function handleStageResize(e:Event):void { 
     // do some processing here. 
    } 

} 

別的地方:

var mySprite:MySprite = new MySprite(); 
someHolder.addChild(mySprite); 

現在,如果在以後的某個時候,你刪除mySprite上,它仍然流連在內存中,因爲它增加了本身(或對自身的引用) init()方法中的階段。

在這種情況下,避免這種情況的最佳方法是刪除從顯示列表中刪除mySprite時添加到舞臺的偵聽器。

private function init(e:Event = null):void { 
     addEventListener(Event.REMOVED_FROM_STAGE,cleanUp); 
     stage.addEventListener(Event.RESIZE,handleStageResize); 

    } 

    private function cleanUp(e:Event):void { 
     stage.removeEventListener(Event.RESIZE,handleStageResize); 
    } 

我確定其他人會告訴你在向舞臺添加監聽器時使用弱引用,但是你應該刪除監聽器。如果您不這樣做,那麼當您從顯示列表中刪除mySprite並且沒有其他引用時,它將符合GC的條件並最終將從內存中刪除。但在此之前,handleStageResize()中的代碼將繼續執行。

+2

+1 - 正確的閃光燈GC很重要,對於很多自學成功的人來說,這不是一個明顯的問題。 – Bosworth99 2011-05-29 01:22:17

0

我不打算髮表一個這樣的例子,但我會解釋一下。你在這裏描述了兩種情況。

  1. 內存泄漏
  2. 處理器溢出

AS3處理存儲器和處理器操作不同。

內存泄漏發生在有很多對象被創建和銷燬時。這些對象在引用時會泄漏內存,並且在銷燬引用時銷燬該對象,從而留下未使用對象的內存塊=泄漏。

處理器溢出發生在你有很多方法互相引用'閉環'時。

4

我會繼續跟進@ Juan的回答 - GC需要從頭開始考慮作爲應用程序設計的關鍵方面。如果你創建一個對象,你必須意識到每一個對象的引用,並刪除每個引用並使其無效以正確標記@。如果在數組中引用該對象,那麼計數,如果在偵聽器中引用該對象,則計數,如果通過局部變量引用該對象,那麼也會計數(儘管僅在函數的生命週期中),如果它僅在顯示列表,這絕對是重要的,等等。

我甚至在添加之前編寫我的刪除偵聽器語句只是爲了確保

我幾乎總是會爲任何處理內部對象層次結構的對象編寫一個公共destroy()方法(父對象在父子節點上銷燬,這又會對任何子節點等進行調用)。只是在不向每個孩子這樣做的情況下刪除/歸零父母就是糟糕的GC管理。

如果你實際上有任何關於mem leak已經出現的問題,請查看System。totalMemory只是爲了確保:

var mem:String = Number(System.totalMemory/1024/1024).toFixed(2) + ‘Mb’; 
trace(mem); // eg traces 「24.94Mb」 

晴 - 僅僅是有條不紊它 - 它不是火箭科學,但你必須要小心。

乾杯 -

@即使你做,閃光燈組成了自己的主意,當真正做一個掃描。我們所能做的最好的是確保一個對象被正確標記,並且相信它將被有效處理。