2016-10-27 20 views
1

我在啓動程序時啓動了此菜單。 (Main.as:發射mainMenu.asmainMenu.as:推出其它實例中本身)這mainMenu對頂部的按鈕,它說「新遊戲」,我想這個按鈕帶我去下一個菜單,從而消除了mainMenu -instance。刪除子女後繼續後臺進程

我確實成功刪除了mainMenu。不過,我通過在我的一個類中使用trace()而感到遺憾,該函數仍在後臺運行。 (這是mainMenu -instance中的一個實例的類)。通過使用

this.parent.removeChild(this); 
trace("all processes shall now be over"); 

,並通過刪除所有內部mainMenu兒::

我曾經嘗試都通過消除mainMenu -instance

while (this.numChildren > 0) { 
    this.removeChildAt(0); 
} 
trace("there shall be nothing going on after this"); 

這消除了所有的視覺的東西從屏幕上。但是來自mainMenu內的其中一個實例的計時器循環功能仍在後臺運行,再次被trace()詛咒。所有這些孩子在這個時候都應該被淘汰,那麼這些過程怎麼還在運行呢?這noobie需要幫助。

+0

確保在刪除菜單本身之前刪除主菜單及其內部的所有事件偵聽器。如果有任何活動的事件偵聽器,則對象將收集垃圾。或者在添加事件偵聽器時使用弱引用(在addEventListener方法中有一個可選的標誌) – Philarmon

回答

1

從顯示列表中刪除對象不會立即強制它被垃圾收集。您定義的任何計時器將保持開啓狀態,直到停止或垃圾收集爲止。

您可以通過搜索「flex memory management」或「actionscript 3 memory management」來了解關於此主題的更多信息。

關於你提到的具體菜單例如,更新您的代碼如下:

你的菜單類,菜單類的子類都應該實現一個接口「ITimerUser」,它指定一個「stopTimers」功能 - 它看起來像這樣的:

public function stopTimers():void { 
    //If there is a timer defined 
    this.myTimer.stop(); 
    this.myTimer = null; 
} 

然後更改您移除代碼看起來像這樣(NB如果您有非定時器用戶混入,使stopTimers電話可選):

while (this.numChildren > 0) { 
    var child = (ITimerUser) this.getChildAt(0); 
    if (child) { 
     child.stopTimers(); 
    } 
    this.removeChildAt(0); 
} 
this.stopTimers(); 
this.parent.removeChild(this); 
+0

非常感謝!我一定會更多地關注界面。作爲我的控制怪胎,我發現令人沮喪的是,你無法完全控制as3中的內存管理。那麼,我想我只需要學習如何解決垃圾收集器。 我是一般的編程新手,想到也許我可以從內存中一起擦除與特定類相關的所有數據。那麼,現在我開始看到部分鬥爭了。 –

+0

@ T.Alexander即使在非託管語言中,顯示與否與內存中的現有顯示是分開的。爲了增加這個答案:如果它只是一個類成員,那麼就不需要將定時器設置爲null,以便使對象成爲垃圾收集的一部分。 – null

+0

@null好點。將變量設置爲'null'是我在開發模塊化Flex應用程序中的對象時遇到的(也許是壞的)習慣;這裏並不是絕對必要的。 – Brian