在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了..
来自:http://blog.l4cd.net/