让对象removeChild时自动删除子对象/属性/侦听

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

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

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

下面这个类继承了MovieClip,当他的实例在removeChild的时候,对象将"自我毁灭"

  1. package  net.L4cd.display{   
  2.      import  flash.display. MovieClip ;   
  3.      import  flash.events. Event ;   
  4.     dynamic  public   class  iMovieClip  extends   MovieClip {   
  5.          private   var  lis: Array ; //定义一数组保存侦听    
  6.          public   function  iMovieClip(){   
  7.             lis =  new   Array ()   
  8.              addEventListener ( Event .REMOVED,remove) //侦听删除事件    
  9.         }   
  10.            
  11.          //重写addEventListener,在增加侦听的时候..把相应的事件保存到数组    
  12.         override  public   function   addEventListener (type: String , listener: Function , useCapture: Boolean  =  false , priority: int  = 0, useWeakReference: Boolean  =  false ): void {   
  13.             lis.push([type,listener,useCapture])   
  14.              super . addEventListener (type,listener,useCapture,priority,useWeakReference)   
  15.         }   
  16.            
  17.          //"自我毁灭"的方法    
  18.          private   function  remove(e: Event ): void {   
  19.              if (e.currentTarget != e.target) return   
  20.             stop()   
  21.              //删除子对象    
  22.             trace( "删除前有子对象" ,numChildren)   
  23.              while (numChildren > 0){   
  24.                 removeChildAt(0)   
  25.             }   
  26.             trace( "删除后有子对象" ,numChildren)   
  27.                
  28.              //删除动态属性    
  29.              for ( var  k: String   in   this ){   
  30.                 trace( "删除属性" ,k)   
  31.                  delete   this [k]   
  32.             }   
  33.                
  34.              //删除侦听    
  35.              for ( var  i: uint =0;i<lis.length;i++){   
  36.                 trace( "删除Listener" ,lis[i][0])   
  37.                 removeEventListener(lis[i][0],lis[i][1],lis[i][2])   
  38.             }   
  39.             lis =  null   
  40.         }   
  41.     }   
  42. }  

然后我们另外新建一个flash,直接在时间轴上写下以下代码

  1. import  net.L4cd.display.iMovieClip;   
  2. var  mc: MovieClip  =  new  iMovieClip()   
  3. mc. addEventListener ( Event .ADDED,aaaa)   
  4. mc. addEventListener ( Event .ADDED_TO_STAGE,aaaa)   
  5. mc. addEventListener ( Event .ENTER_FRAME,aaaa)   
  6. mc. addEventListener ( MouseEvent .CLICK,aaaa)   
  7. mc. addEventListener ( MouseEvent .MOUSE_DOWN,aaaa)   
  8. mc.a =  "http://L4cd.Net"   
  9. mc.b =  "我是动态属性2"   
  10. mc.name =  "我是MC"   
  11. addChild(mc)   
  12. function  aaaa(e: Event ){   
  13.        
  14. }   
  15. removeChild(mc)   
  16. mc =  null   

运行后.,,输出框就会出现

  1. 删除前有子对象 0   
  2. 删除后有子对象 0   
  3. 删除属性 b   
  4. 删除属性 a   
  5. 删除Listener removed   
  6. 删除Listener added   
  7. 删除Listener addedToStage   
  8. 删除Listener enterFrame   
  9. 删除Listener click   
  10. 删除Listener mouseDown  

这样,,,我们能做的事都已经做完了..等垃圾回收进行回收就ok了

上面的remove方法就是mc在移除的时候,对自己进行的清理,,
注意的是,以上只针对MovieClip进行的清理,每个类或你自定义的类都有不同..
如Sprite不需用要stop(),不需要删除动态属性..等等..
这个就由你自己去发挥~
写一组自己的"自我毁灭"类..

还有需要注意的是..像有时候,你只想removeChild,而不想进行删除,这样可以把上面的代码进行修改.
把remove设置为公开的方法
然后把addEventListener(Event.REMOVED,remove)去掉..
最后在你想删除对象的时候,,,再调用remove()就ok了..

来自:http://blog.l4cd.net/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值