当前位置: 代码迷 >> Web前端 >> 在AS3里.小弟我们无法手动完全删除一个对象,
  详细解决方案

在AS3里.小弟我们无法手动完全删除一个对象,

热度:60   发布时间:2012-10-31 14:37:32.0
在AS3里..我们无法手动完全删除一个对象,,
在AS3里..我们无法手动完全删除一个对象,,
以MovieClip为例..
我们只有在删除它的时候
除了removeChild(对象)外
还必须清空它的子对象
删除所有动态添加的属性
删除所有侦听
删除所有引用
然后等待垃圾回收,

可是实际操作的时候..
在长长的代码当中..经常会忘记自己什么时候写了侦听..什么时候添加了动态属性

其实,,我们可以借用显示对象中的Event.REMOVED,在删除对象的时候,让对象自己调用删除函数,删除相关的东西

下面这个类继承了MovieClip,当他的实例在removeChild的时候,对象将"自我毁灭" <视频教程'>css.shtml' target='_blank' title = 'div视频教程'>div class="code">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了..
  相关解决方案