AS3で不要になったインスタンスを削除しメモリを解放する「Cleaner」クラス

ActionScript3.0で不要になったインスタンスを削除しメモリを解放する「Cleaner」クラスを作成しました。

指定したオブジェクトの子を、任意の数まで削除します。新しい子から順番に削除するか、古い子から順番に削除するかの指定と、最後にオブジェクトへ nullを代入してメモリを解放するかの指定ができます。

サンプルでは、オブジェクトへ子を追加した後と削除した後に、それぞれのオブジェクトが持つ子の数を出力しています。

下記のボタンより、サンプルおよびソースのダウンロードができます。

Download

【使用例】

_container(DisplayObjectContainer)の子を、古いものから順番に全て削除する


Cleaner.deleteContainer(_container);

_mc(MovieClip)の子を、古いものから順番に全て削除し、最後に nullを代入する


Cleaner.deleteMovieClip(_mc, 0, null);

_sp(Sprite)の子を、最後の1つを除いて新しいものから順番に削除する


Cleaner.deleteSprite(_sp, 1, "null,undefined以外の文字列", true);

【パラメータ説明】

_container, _mc, _sp


子を削除するオブジェクト
[DisplayObjectContainer, MovieClip, Sprite][省略不可]

remainNum


幾つ子を残すか
[uint][規定値:0][省略可]

toNull


最後にオブジェクトに nullを代入する場合は、nullか undefinedを指定
[String][規定値:"String as Null"((パラメータ:toNullの初期値は、nullと undefined以外の文字列にしています。undefinedも nullに変換されてしまうんですね(TT)。is演算子を使うなどもっと良い判別方法があるかもしれません。))][省略可]

isReverse


新しいもの/上から順番に削除するか
[Boolean][規定値:false][省略可]

ソースコード

import jp.atziluth.utils.Cleaner;


package jp.atziluth.utils{
import flash.display.DisplayObjectContainer;
import flash.display.MovieClip;
import flash.display.Sprite;
public class Cleaner {
public static function deleteContainer(
_container:DisplayObjectContainer,
remainNum:uint=0,
toNull:String="String as Null",
isReverse:Boolean=false
):void {
if (_container == null) {
return;
}
if (isReverse) {
while (_container.numChildren > remainNum) {
_container.removeChildAt(_container.numChildren - 1);
}
} else {
while (_container.numChildren > remainNum) {
_container.removeChildAt(0);
}
}
if (toNull == null) {
_container = null;
}
}
public static function deleteMovieClip(
_mc:MovieClip,
remainNum:uint=0,
toNull:String="String as Null",
isReverse:Boolean=false
):void {
if (_mc == null) {
return;
}
if (isReverse) {
while (_mc.numChildren > remainNum) {
_mc.removeChildAt(_mc.numChildren - 1);
}
} else {
while (_mc.numChildren > remainNum) {
_mc.removeChildAt(0);
}
}
if (toNull == null) {
_mc = null;
}
}
public static function deleteSprite(
_sp:Sprite,
remainNum:uint=0,
toNull:String="String as Null",
isReverse:Boolean=false
):void {
if (_sp == null) {
return;
}
if (isReverse) {
while (_sp.numChildren > remainNum) {
_sp.removeChildAt(_sp.numChildren - 1);
}
} else {
while (_sp.numChildren > remainNum) {
_sp.removeChildAt(0);
}
}
if (toNull == null) {
_sp = null;
}
}
}
}

サンプルソースコード】

Sample.as


package {
import flash.display.MovieClip;
import flash.display.Sprite;
import jp.atziluth.utils.Cleaner;
public class Sample extends Sprite {
private var _container:Container=new Container();
private var _mc:MovieClip=new MovieClip();
private var _sp:Sprite=new Sprite();
private var children:Array=new Array();
public function Sample():void {
addScopes();
addChildren();//削除するターゲットの追加
tracer("Phase1");//ターゲット追加後の numChildren出力

deleteScopes();//追加したターゲットの削除
tracer("Phase2");//ターゲット削除後の numChildren出力
}
private function addScopes():void {
this.addChild(_container);
this.addChild(_mc);
this.addChild(_sp);
}
private function addChildren():void {
children[0]=new Array();
children[1]=new Array();
children[2]=new Array();
iterate(_container, children[0], 3);
iterate(_mc, children[1], 5);
iterate(_sp, children[2], 7);
}
private function iterate($scope:Object, $children:Array, iterateNum:uint=1):void {
for (var i:uint; i<iterateNum; i++) {
$children[i]=new Sprite();
$scope.addChild($children[i]);
}
}
private function deleteScopes():void {
Cleaner.deleteContainer(_container, 0, null);
Cleaner.deleteMovieClip(_mc, 0, null);
Cleaner.deleteSprite(_sp, 0, null);
}
private function tracer(str:String=null):void {
trace(str+"-------------------------------------");
trace("_container.numChildren: "+_container.numChildren);
trace("_mc.numChildren: "+_mc.numChildren);
trace("_sp.numChildren: "+_sp.numChildren);
trace("-------------------------------------------");
}
}
}

【サンプル出力結果】


Phase1-------------------------------------
_container.numChildren: 3
_mc.numChildren: 5
_sp.numChildren: 7

                                                                                    • -

Phase2-------------------------------------
_container.numChildren: 0
_mc.numChildren: 0
_sp.numChildren: 0

                                                                                    • -

Download