导航

 Flexs.cn

Flash、AS2 、AS3、Flex、FMS、RED5、AIR 、游戏制作教程聚合

« AS3 库资源 类库Flash CS5 一瞥及若干MAX猛料 »

让对象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/

  • 相关文章:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。


Powered By MaxSugar

Copyright 2005-2007 Flexs.cn Some Rights Reserved.

Search

最近发表