Flex——IDispose接口

本文探讨了C/C++中内存管理的重要性及在托管环境中如何通过IDispose接口实现资源的自动释放。详细介绍了如何在Flex/AS3中实现类似.NET环境下的IDispose模式,包括接口定义、类实现以及资源释放工具类的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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、付费专栏及课程。

余额充值