Flex——IDispose接口

news/2024/5/19 18:43:45 标签: flex, function, dictionary, null, import, class
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">

前言

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

IDispose接口

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

package cwn.core

{

    /*

     * 释放资源接口

     */

    public interface IDispose

    {

        class="tags" href="/tags/FUNCTION.html" title=function>function Dispose():void;

    }

}

实现IDispose接口

public class ClassA implements cwn.core.IDispose

{

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

    public class="tags" href="/tags/FUNCTION.html" title=function>function ClassA()

    {

    }

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

    protected class="tags" href="/tags/FUNCTION.html" title=function>function Disposing():void

    {

    }

    public class="tags" href="/tags/FUNCTION.html" title=function>function Dispose():void

    {

        if (_Disposed)

            return;

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

        _RefObject = class="tags" href="/tags/NULL.html" title=null>null; //释放ClassA资源

    }

}

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

public class ClassB extends ClassA

{

    private var _RefObject2:Object;

    public class="tags" href="/tags/FUNCTION.html" title=function>function ClassB()

    {

        super();

    }

    override protected class="tags" href="/tags/FUNCTION.html" title=function>function Disposing():void

    {

        //释放ClassB资源

        if(_RefObject2 is IDispose)

        {

            IDispose(_RefObject2).Dispose();

        }

        _RefObject2 = class="tags" href="/tags/NULL.html" title=null>null;

            

        super.Disposing();

    }

}

DisposeUtil对象

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

package cwn.core

{

    class="tags" href="/tags/IMPORT.html" title=import>import flash.display.Bitmap;

    class="tags" href="/tags/IMPORT.html" title=import>import flash.display.DisplayObject;

    class="tags" href="/tags/IMPORT.html" title=import>import flash.display.MovieClip;

    class="tags" href="/tags/IMPORT.html" title=import>import flash.display.Sprite;

    class="tags" href="/tags/IMPORT.html" title=import>import flash.utils.Dictionary;

    class="tags" href="/tags/IMPORT.html" title=import>import mx.collections.ArrayCollection;

    class="tags" href="/tags/IMPORT.html" title=import>import mx.controls.SWFLoader;

 

    public final class DisposeUtil

    {

        public static class="tags" href="/tags/FUNCTION.html" title=function>function Dispose(value:Object):void

        {

            if (value == class="tags" href="/tags/NULL.html" title=null>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 class="tags" href="/tags/FUNCTION.html" title=function>function ClearArray(value:Array):void

        {

            if (value == class="tags" href="/tags/NULL.html" title=null>null)

                return;

            while (value.length > 0)

            {

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

                if (child != class="tags" href="/tags/NULL.html" title=null>null)

                    child.Dispose();

            }

        }

        private static class="tags" href="/tags/FUNCTION.html" title=function>function ClearArrayCollection(value:ArrayCollection):void

        {

            if (value == class="tags" href="/tags/NULL.html" title=null>null)

                return;

            while (value.length > 0)

            {

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

                if (child != class="tags" href="/tags/NULL.html" title=null>null)

                    child.Dispose();

            }

        }

        private static class="tags" href="/tags/FUNCTION.html" title=function>function DisposeSprite(value:Sprite):void

        {

            if (value == class="tags" href="/tags/NULL.html" title=null>null)

                return;

            while (value.numChildren > 0)

            {

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

                if (child is IDispose)

                    IDispose(child).Dispose();

            }

        }

        private static class="tags" href="/tags/FUNCTION.html" title=function>function DisposeSWFLoader(value:SWFLoader):void

        {

            if (value == class="tags" href="/tags/NULL.html" title=null>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 = class="tags" href="/tags/NULL.html" title=null>null;

        }

        private static class="tags" href="/tags/FUNCTION.html" title=function>function ClearDictionary(value:Dictionary):void

        {

            if (value == class="tags" href="/tags/NULL.html" title=null>null)

                return;

            for each (var key:* in value)

            {

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

                if (value != class="tags" href="/tags/NULL.html" title=null>null)

                    val.Dispose();

                delete value[key];

            }

        }

    }

}


http://www.niftyadmin.cn/n/1574757.html

相关文章

26期Linux20180531 单用户 救援模式 克隆虚拟机 linux机器相互登录

5月31日任务1.13 单用户模式1.14 救援模式1.15 克隆虚拟机1.16 Linux机器相互登录单用户模式忘记root密码?1. 单用户模式2.救援模式单用户模式首先需要重启linux (reboot, init 6, shutdown -r now 都可以重启)e-edit然后按 ctrl x 就会进入紧…

Flex——命令管理,Undo来Redo去

前言 Undo,Redo是编辑环境里常见的并且非常重要的功能,下面介绍【命令模式】在Flex/AS3下的实现。 ICommand接口 定义ICommand接口,其中Execute和UnExecute是相反的2个操作,Title属性用于命令显示,例如显示在操作历…

减少前端代码耦合

什么是代码耦合?代码耦合的表现是改了一点毛发而牵动了全身,或者是想要改点东西,需要在一堆代码里面找半天。由于前端需要组织js/css/html,耦合的问题可能会更加明显,下面按照耦合的情况分别说明: 1. 避免全…

Flex通信篇——构建企业级HTTP通信层

概述 RIA和SOA是一对绝配。SOA强调把业务以接口方式向外界提供不关注前端的呈现,而RIA则强调用户体现,结合两者优势能够设计出用户体现良好、灵活的、易扩展、易集成的系统。要处理好RIA前端和SOA后端,需要搭建一个健壮的企业级通信层&#…

一篇非常好的Spring教程

发现了一个Spring入门系列的教程,讲的比较细致和透彻。 Liu Lixiang的博客转载于:https://www.cnblogs.com/qinhao517/p/9123269.html

【Elasticsearch】第3篇:Elasticsearch-head插件安装

为什么要使用elasticsearch-head 访问http://127.0.0.1:9200/看的的web界面并不是很友好,此时我可以使用elasticsearch-head插件来提供友好的web界面。 安装elasticsearch-head插件 1.登录github.com搜索elasticsearch-head然后下载: wget https://githu…

45个好习惯

态度篇 1. 做实事 不要抱怨,发牢骚,指责他人,找出问题所在,想办法解决。对问题和错误,要勇于承担。 2. 欲速则不达 用小聪明、权宜之计解决问题,求快而不顾代码质量,会给项目留下要命的死…

学了那么长的Python,Python面试题长啥样?[面试题整理]

2019独角兽企业重金招聘Python工程师标准>>> 从去年开始接触Python到如今大概是一年半左右,这一年半我已经深深的陷在Python的世界里无法自拔。她是一门神奇的语言,她很神奇,她很火,她很受欢迎。早些时候,我…