转自: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 eventListeners

private var stageListeners

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(dsp


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(doc

if(doc==null || !doc.stage)return;
var remList:Array = [];
for(var i:int=0;i<doc.numChildren;i++){
var sub

if(exclude!=null && exclude.indexOf(sub) != -1){
continue;
}else{
remList.push(sub);
}
}
for each(var dsp

try{
dsp.parent.removeChild(dsp);
} catch(error:Error) {
// catch block
trace(error);
}
if(cleanCbk != null)
cleanCbk(dsp);
dsp = null;
}
}
// end class
}
}