因为AS3的垃圾回收是自动的,如果你某个对象存在被引用,或者有没有被清除的事件侦听,当你unload 和 removedChild时都不能彻底的从内存中移除它。
所以我们在写代码的时候一定要记得:
声明了一个变量或引用要记得及时清空,如:
var _mc=_movieClip
......
_mc=null
如果有一个数组,里面保存的是许多其他对象的引用,那么光设置这个数组为null是不行的,还要设置其每一个元素的值也为空arr[i]=null,比如
var _arry:Array=new Array(); for (var i=0; i<_mc.numChildren; i++) { var _mc = _mc.getChildAt(i) as MovieClip; arry.push(_mc); }
clear:
for (var i=0; i<_arry.length; i++) { _arry[i] = null; } _arry = [];
2、事件侦听也要及时清除。
具体看一段代码片段:
function removeSelf(e:Event):void { trace("remove me now...."); removeEventListener(Event.ADDED_TO_STAGE, addStage); stage.removeEventListener(gamestate.GAMEBOX_NOTICE_CLOSED, toReady); removeEventListener(Event.REMOVED_FROM_STAGE, removeSelf); _lostTimer.removeEventListener(TimerEvent.TIMER, setLeftTime); try { new LocalConnection.connect("foo"); new LocalConnection.connect("foo"); } catch (error:Error) { } System.gc(); } addEventListener(Event.REMOVED_FROM_STAGE,removeSelf);//当元件被移除舞台时
3、还有强制垃圾回收。
try {
new LocalConnection .connect("foo"); new LocalConnection .connect("foo"); } catch (error:Error) { } System.gc();