论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > Flash AS编程教程
Tag:2.0,3.0菜鸟,游戏,,cs,技巧,源码,,文本,文字,函数,音乐,随机,拖拽,asp,access,xml,mc,视频教程

自动删除子对象/属性/侦听(as3.0)

文章类别:Flash AS编程 | 发表日期:2008-10-6 18:37:39


让对象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了..

相关下载
视频教程列表
文章教程搜索
 
Flash AS推荐教程
Flash AS热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058