2011-09-08 65 views
0

我開發了我的第一個Flex應用程序,它是TabbedViewNavigatorApplication。應用程序工作正常,但當我在「配置文件處理程序」中測試應用程序時,隨着我瀏覽應用程序,內存使用量不斷增加。當我知道這一點時,我必須刪除所有添加的eventlistener,並且必須使不再需要的對象無效。當我在標籤之間切換時,標籤一次又一次地初始化。柔性移動項目:內存管理

我不知道在哪裏可以刪除eventlisteners。我的意思是,我爲每個事件聽衆編寫了函數。當控制進入函數定義時,是否需要刪除eventlistener?

我寫的示例代碼

var more:Image = new Image(); 
    more.width = 70; 
    more.height=29; 
    more.x=10; 
    more.y=276; 
    more.source = "Assets/more button.png"; 
    more.addEventListener(MouseEvent.CLICK, MORE_clickHandler); 
    mainGroup.addElement(more); 



private function MORE_clickHandler(e:MouseEvent):void { 

// Do I need to remove the eventlistener here 

} 

而且,我需要明確廢止,我創建或垃圾收集器會處理這件事Image類的對象。如果我需要明確地取消它,在哪裏做到這一點。

謝謝

回答

1

垃圾收集是任何語言的重要組成部分,尤其是在移動。由於移動設備比我們的桌面設備更受限制,因此您需要非常小心創建/存儲到內存中的內容。我的座右銘是,如果你沒有看到它,你就不應該保留它。您可以銷燬視圖,但使用視圖模型保持其狀態。

要刪除視圖,您需要先從顯示列表中刪除它(removeElement(yourObject)),刪除所有事件偵聽器,並取消任何引用變量。如果任何變量仍然引用它,它將不會被垃圾收集。

我建議你多閱讀一下垃圾回收以及一些整潔的技巧,比如池化和虛擬化(列表中的項目渲染器)。

+0

嗨J_A_X,如何以及在哪裏刪除事件監聽器和無效引用變量的位置。你能舉個例子嗎? –

+0

我不能展示一個例子,因爲它取決於你想要完成的行爲。就像調用'removeEventListener'一樣簡單,使用'removeElement'從顯示列表中移除並執行'yourVar = null;'。 –

+0

謝謝J_A_X,我會這麼做 –

0

您可以設置具有弱引用的事件偵聽器。

這意味着當對象的唯一引用是偵聽器時,對象本身仍然可以被垃圾收集,並且偵聽器不會將其保存在內存中。

下面將做的伎倆:

more.addEventListener(MouseEvent.CLICK, MORE_clickHandler,false, 0, true); 

另一種選擇是子類圖像類,讓它實現一個IDisposable接口,這將迫使你實現一個dispose()方法。

一些方便的資源:
http://www.intriguemedia.net/2007/09/24/when-to-use-weak-references
http://gskinner.com/blog/archives/2006/07/as3_weakly_refe.html

歡呼

+0

使用弱引用是因爲1)它鼓勵潦草編碼和2)標記和清理垃圾收集比引用計數慢(即當你清理你自己的事件偵聽器) –