让对象removeChild时自动删除子对象/属性/侦听(as3.0)在AS3里..我们无法手动完全删除一个对象,,
以MovieClip为例..
我们只有在删除它的时候
除了removeChild(对象)外
还必须清空它的子对象
删除所有动态添加的属性
删除所有侦听
删除所有引用
然后等待垃圾回收,
可是实际操作的时候..
在长长的代码当中..经常会忘记自己什么时候写了侦听..什么时候添加了动态属性
其实,,我们可以借用显示对象中的Event.REMOVED,在删除对象的时候,让对象自己调用删除函数,删除相关的东西
下面这个类继承了MovieClip,当他的实例在removeChild的时候,对象将"自我毁灭"
package net.L4cd.display{
import flash.display.MovieClip;
import flash.events.Event;
dynamic public class iMovieClip extends MovieClip{
private var lis:Array;//定义一数组保存侦听
public function iMovieClip(){
lis = new Array()
addEventListener(Event.REMOVED,remove)//侦听删除事件
}
//重写addEventListener,在增加侦听的时候..把相应的事件保存到数组
override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void{
lis.push([type,listener,useCapture])
super.addEventListener(type,listener,useCapture,priority,useWeakReference)
}
//"自我毁灭"的方法
private function remove(e:Event):void{
if(e.currentTarget != e.target)return
stop()
//删除子对象
trace("删除前有子对象",numChildren)
while(numChildren > 0){
removeChildAt(0)
}
trace("删除后有子对象",numChildren)
//删除动态属性
for(var k:String in this){
trace("删除属性",k)
delete this[k]
}
//删除侦听
for(var i:uint=0;i<lis.length;i++){
trace("删除Listener",lis[i][0])
removeEventListener(lis[i][0],lis[i][1],lis[i][2])
}
lis = null
}
}
}
然后我们另外新建一个flash,直接在时间轴上写下以下代码
import net.L4cd.display.iMovieClip;
var mc:MovieClip = new iMovieClip()
mc.addEventListener(Event.ADDED,aaaa)
mc.addEventListener(Event.ADDED_TO_STAGE,aaaa)
mc.addEventListener(Event.ENTER_FRAME,aaaa)
mc.addEventListener(MouseEvent.CLICK,aaaa)
mc.addEventListener(MouseEvent.MOUSE_DOWN,aaaa)
mc.a = "http://L4cd.Net"
mc.b = "我是动态属性2"
mc.name = "我是MC"
addChild(mc)
function aaaa(e:Event){
}
removeChild(mc)
mc = null
运行后.,,输出框就会出现
删除前有子对象 0
删除后有子对象 0
删除属性 b
删除属性 a
删除Listener removed
删除Listener added
删除Listener addedToStage
删除Listener enterFrame
删除Listener click
删除Listener mouseDown
这样,,,我们能做的事都已经做完了..等垃圾回收进行回收就ok了
上面的remove方法就是mc在移除的时候,对自己进行的清理,,
注意的是,以上只针对MovieClip进行的清理,每个类或你自定义的类都有不同..
如Sprite不需用要stop(),不需要删除动态属性..等等..
这个就由你自己去发挥~
写一组自己的"自我毁灭"类..
还有需要注意的是..像有时候,你只想removeChild,而不想进行删除,这样可以把上面的代码进行修改.
把remove设置为公开的方法
然后把addEventListener(Event.REMOVED,remove)去掉..
最后在你想删除对象的时候,,,再调用remove()就ok了..
相关下载