[ActionScript 3] 内存清理

本文介绍了一个内存清理基类,该类适用于简化Sprite对象的生命周期管理,包括事件监听器的添加与移除,以及内存资源的释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://bbs.9ria.com/thread-404064-1-16.html


内存清理基类一般显示对象,只要继承这个就好了

根据测试不是很复杂的对象 一般都会被释放掉所占内存
package{
        import flash.display.DisplayObject;
        import flash.display.DisplayObjectContainer;
        import flash.display.Sprite;
        import flash.display.Stage;
        import flash.events.Event;
        import flash.system.ApplicationDomain;
        import flash.utils.Dictionary;
        import flash.utils.describeType;
        import flash.utils.getDefinitionByName;
        import flash.utils.getQualifiedClassName;

        public class BaseSprite extends Sprite{
                private var eventListenersictionary = new Dictionary();
                private var stageListenersictionary = new Dictionary();
                
                public function BaseSprite(isLive:Boolean=true){
                        this.addEventListener(Event.ADDED_TO_STAGE, addedToStage);
                        this.addEventListener(Event.REMOVED_FROM_STAGE, delayRemoveFromStage);
                }
                
                protected var _myStage:Stage;
                protected function addedToStage(e:Event):void{
                        this.removeEventListener(Event.ADDED_TO_STAGE, addedToStage);
                        _myStage = this.stage;
                }
                
                /**
                 * 延时移除舞台 
                 * @param event
                 */                
                protected function delayRemoveFromStage(e:Event):void{
                        trace("delayRemoveFromStage");
                        this.removeEventListener(Event.REMOVED_FROM_STAGE, delayRemoveFromStage);
                        removedFromStage();
                }
                
                protected function removedFromStage():void{
                        cleanSub(this);
                        removeAllEventListeners();
                        _myStage = null;
                }
                
                public function stageAddEventListener(type:String, listener:Function, 
                                                                                                  useCapture:Boolean = false, priority:int = 0,
                                                                                                  useWeakReference:Boolean = false):void
                {
                        _myStage.addEventListener(type, listener, useCapture, priority, useWeakReference);
                        const listenerProps:Array = stageListeners[listener] as Array;
                        if (listenerProps){
                                listenerProps.push(type, useCapture);
                        }else{
                                stageListeners[listener] = [type, useCapture];
                        }
                }
                
                override public function addEventListener(type:String, listener:Function, 
                                                                                                  useCapture:Boolean = false, priority:int = 0,
                                                                                                  useWeakReference:Boolean = false):void
                {
                        super.addEventListener(type, listener, useCapture, priority, useWeakReference);
                        const listenerProps:Array = eventListeners[listener] as Array;
                        if (listenerProps){
                                listenerProps.push(type, useCapture);
                        }else{
                                eventListeners[listener] = [type, useCapture];
                        }
                }
                
                public function removeAllEventListeners():void{
                        removeListeners(this,eventListeners);
                        if(stage)
                                removeListeners(stage,stageListeners);
                        
                        var domain:ApplicationDomain = ApplicationDomain.currentDomain;
                        var myName:String = getQualifiedClassName(this);
                        var SrcClass:* = domain.getDefinition(myName) as Class;
                        var instanceInfo:XML = describeType(SrcClass);
                        var vlen:int = instanceInfo.factory[0].variable.length();
                        var alen:int = instanceInfo.factory[0].accessor.length();
                        var i:int = 0;
                        
                        for(i = 0 ; i < vlen; i++){
                                var vName:String = instanceInfo.factory[0].variable[i].@name;
                                this[vName] = null;
                        }
                        /*
                        for(i = 0 ; i < alen; i++){
                                var cName:String = instanceInfo.factory[0].accessor[i].@name;
                                var access:String = instanceInfo.factory[0].accessor[i].@access;
                                if(access.indexOf("write") != -1){
                                        this[cName] = null;
                                }
                        }
                        */
                }
                
                public function removeListeners(dspisplayObject, listenersictionary):void{
                        for (var listener:Object in listeners){
                                const listenerProps:Array = listeners[listener] as Array;
                                var n:uint = listenerProps.length;
                                for (var i:uint = 0; i < n;){
                                        dsp.removeEventListener(listenerProps[i++] as String, listener as Function, listenerProps[i++] as Boolean);
                                }
                                delete listeners[listener];
                        }
                }
                
                /** 
                 * cleanSub
                 * 清理容器内表示列表
                 * @return void
                 */
                private function cleanSub(docisplayObjectContainer,exclude:Array=null,cleanCbk:Function = null):void{
                        if(doc==null || !doc.stage)return;
                        var remList:Array = [];
                        for(var i:int=0;i<doc.numChildren;i++){
                                var subisplayObject = doc.getChildAt(i);
                                if(exclude!=null && exclude.indexOf(sub) != -1){
                                        continue;
                                }else{
                                        remList.push(sub);
                                }
                        }
                        
                        for each(var dspisplayObject in remList){
                                try{
                                        dsp.parent.removeChild(dsp);
                                } catch(error:Error) {
                                        // catch block 
                                        trace(error);
                                }
                                
                                if(cleanCbk != null)
                                        cleanCbk(dsp);
                                dsp = null;
                        }
                }
                
                // end class
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值