沒有看到代碼或知道你正在聽什麼事件以及誰/什麼觸發他們,這確實很難知道。但是,我的猜測是,movieclip沒有被收集(這不是一個內存泄漏!),所以,他們仍然是敵手和踢。你可能應該有一個方法將它們設置爲「空閒」狀態,可以這麼說。意思是,你刪除了聽衆,停止定時器等。這個想法是把你的對象置於不運行任何代碼的狀態。
對於動畫片段和其他顯示對象來說,一個簡單的方法就是偵聽ADDED_TO_STAGE和REMOVED_FROM_STAGE事件。這裏的想法是,當你的對象被添加到舞臺上時,你的對象「激活」,在你的情況下,當你到達遊戲類的第2幀時,它會被激活;它「停用」時,它的拆除,也就是說,當你回到框架沿着這些線路1.
東西:
public class Game extends MovieClip {
private var _timer:Timer;
public function Game() {
addEventListener(Event.ADDED_TO_STAGE,init);
addEventListener(Event.REMOVED_FROM_STAGE,destroy);
}
private function init():void {
// your init code goes here
// just an example:
_timer = new Timer(33);
_timer.addEventListener(TimerEvent.TIMER,mainLoop);
_timer.start();
trace("init");
}
private function destroy():void {
_timer.stop();
_timer.removeEventListener(TimerEvent.TIMER,mainLoop);
trace("destroy");
}
private function mainLoop(e:TimerEvent):void {
// code for main loop here...
trace("mainLoop");
}
}
檢查的痕跡,看看它的正常工作。你應該看到「init」被追蹤出來,然後「mainLoop」只要你留在第2幀中,當你回到第1幀時就會「銷燬」。「mainLoop」應該停止在這一點上追蹤。除此之外,你可能想要檢查是否沒有內存泄漏(事實上你有7個實例並不意味着你有泄漏;但是在某些時候,如果GC失敗了,至少有一些他們應該被釋放;如果這從來沒有發生,這是一個泄漏的症狀;嘗試迫使一個GC,看看是否有多少個盟友實例失效;如果沒有,很可能是你有泄漏)。
這很有道理。我現在正在閱讀關於GC的內容,並且我確保刪除事件監聽器,現在它似乎工作正常。我喜歡你使用Event.REMOVED_FROM_STAGE的想法。謝謝!! – 2010-06-14 03:37:03
+1。跟我建議的一樣,但你打我30秒! – 2010-06-14 03:37:28
嘿嘿,我已經學會在我的思想中途完成時發佈我的答案。然後回去完成它。 Sneaaaaky,查理。 – typeoneerror 2010-06-14 03:38:59