Flex——IDispose接口

前言

C/C++的开发,内存的管理是十分重要的课题,分配内存使用后要及时释放,否则内存泄漏导致内存耗尽。进入托管环境后,内存能够自动管理和回收,已经不用开发者太操心内存管理方面的问题了,在托管环境,开发者仍然可以做一些工作,提供内存回收的效率,例如,把类内部的引用对象设置为null是最基本的。借鉴在.net环境下的IDispose模式,现在,在Flex/AS3里实现。

IDispose接口

首先定义控制资源释放的接口。

package cwn.core

{

    /*

     * 释放资源接口

     */

    public interface IDispose

    {

        function Dispose():void;

    }

}

实现IDispose接口

public class ClassA implements cwn.core.IDispose

{

    private var _RefObject:Object;//引用高级对象

    public function ClassA()

    {

    }

    private var _Disposed:Boolean = false;//释放控制标志

    protected function Disposing():void

    {

    }

    public function Dispose():void

    {

        if (_Disposed)

            return;

        Disposing();//释放派生类的资源

        _RefObject = null; //释放ClassA资源

    }

}

Disposing方法是派生类释放资源时按需要重写的,例如下面的ClassB

public class ClassB extends ClassA

{

    private var _RefObject2:Object;

    public function ClassB()

    {

        super();

    }

    override protected function Disposing():void

    {

        //释放ClassB资源

        if(_RefObject2 is IDispose)

        {

            IDispose(_RefObject2).Dispose();

        }

        _RefObject2 = null;

            

        super.Disposing();

    }

}

DisposeUtil对象

定义一个资源释放的工具类,方便调用,集中释放。

package cwn.core

{

    import flash.display.Bitmap;

    import flash.display.DisplayObject;

    import flash.display.MovieClip;

    import flash.display.Sprite;

    import flash.utils.Dictionary;

    import mx.collections.ArrayCollection;

    import mx.controls.SWFLoader;

 

    public final class DisposeUtil

    {

        public static function Dispose(value:Object):void

        {

            if (value == null)

                return;

            if (value is Array)

            {

                ClearArray(value as Array);

            }

            else if (value is ArrayCollection)

            {

                ClearArrayCollection(value as ArrayCollection);

            }

            else if (value is SWFLoader)

            {

                DisposeSWFLoader(value as SWFLoader);

            }

            else if (value is Sprite)

            {

                DisposeSprite(value as Sprite);

            }

            else if (value is Dictionary)

            {

                ClearDictionary(value as Dictionary);

            }

        }

        private static function ClearArray(value:Array):void

        {

            if (value == null)

                return;

            while (value.length > 0)

            {

                var child:IDispose = value.pop() as IDispose;

                if (child != null)

                    child.Dispose();

            }

        }

        private static function ClearArrayCollection(value:ArrayCollection):void

        {

            if (value == null)

                return;

            while (value.length > 0)

            {

                var child:IDispose = value.removeItemAt(0) as IDispose;

                if (child != null)

                    child.Dispose();

            }

        }

        private static function DisposeSprite(value:Sprite):void

        {

            if (value == null)

                return;

            while (value.numChildren > 0)

            {

                var child:DisplayObject = value.removeChildAt(0);

                if (child is IDispose)

                    IDispose(child).Dispose();

            }

        }

        private static function DisposeSWFLoader(value:SWFLoader):void

        {

            if (value == null)

                return;

            if (value.content is Bitmap)

            {

                Bitmap(value.content).bitmapData.dispose();

            }

            else if (value.content is MovieClip)

            {

                MovieClip(value.content).stop();

            }

            value.unloadAndStop(true);//flash player 10后支持

            value.source = null;

        }

        private static function ClearDictionary(value:Dictionary):void

        {

            if (value == null)

                return;

            for each (var key:* in value)

            {

                var val:IDispose = value[key] as IDispose;

                if (value != null)

                    val.Dispose();

                delete value[key];

            }

        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值