没有看到代码或知道你正在听什么事件以及谁/什么触发他们,这确实很难知道。但是,我的猜测是,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