サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

Starlingフレームワークで表示オブジェクトのイベントリスナーをすべて削除するメソッド

ID: FN1203007 Platform: All Version: CS5/ActionScript 3.0 Runtime: Flash Player 11/AIR 3.0

EventDispatcherクラス
パッケージ starling.events
継承 EventDispatcher → Object
removeEventListeners()メソッド
文法 public function removeEventListeners(type:String = null):void
概要 引数に定めたタイプ(イベント定数の文字列)のイベントリスナーをすべて除く。引数を省くと、すべてのイベントのすべてのリスナーが削除される。
引数

type:String − 削除すべきリスナーのイベントを定める文字列。null(デフォルト値)はすべてのイベントを示す。

戻り値 なし。
DisplayObjectクラス
パッケージ starling.display
継承 DisplayObject → EventDispatcher → Object
dispose()メソッド
文法 public function dispose():void
概要 DisplayObjectインスタンスに含まれるデータをすべて破棄する。GPUバッファが開放され、イベントリスナーはすべて削除される。
引数 なし。
戻り値 なし。
DisplayObjectContainerクラス
パッケージ starling.display
継承 DisplayObjectContainer → DisplayObject → EventDispatcher → Object
dispose()メソッド
文法 public function dispose():void
概要 DisplayObjectContainerインスタンス自身とそのすべての子のDisplayObjectインスタンスに含まれるデータをすべて破棄する。
引数 なし。
戻り値 なし。
removeChildAt()メソッド
文法 public function removeChildAt(index:int, dispose:Boolean = false):void
概要 引数に渡したインデックスの子DisplayObjectインスタンスを表示リストから除く。削除したインスタンス以降の子インスタンスのインデックスは繰り上がる。
引数

index:int − 表示リストから除く子DisplayObjectインスタンスのインデックスを示す整数。

dispose:Booleantrueを渡すと、削除する子DisplayObjectインスタンスに含まれるデータはすべて破棄される。デフォルト値はfalse

戻り値 なし。
removeChild()メソッド
文法 public function removeChild(child:DisplayObject, dispose:Boolean = false):void
概要 引数に渡された子DisplayObjectインスタンスを表示リストから除く。引数のインスタンスが表示リスト内になければ、何も起こらない。
引数

child:DisplayObject − 表示リストから除く子DisplayObjectインスタンス。

dispose:Booleantrueを渡すと、削除する子DisplayObjectインスタンスに含まれるデータはすべて破棄される。デフォルト値はfalse

戻り値 なし。
removeChildren()メソッド
文法 public function removeChildren(beginIndex:int = 0, endIndex:int = -1, dispose:Boolean = false):void
概要 引数に渡されたインデックスの範囲の子DisplayObjectインスタンスを表示リストから除く。引数がなければ、すべての子インスタンスが表示リストから消される。
引数

beginIndex:int − 表示リストから除く最初の子DisplayObjectインスタンスのインデックスを示す整数。デフォルト値は0。

endIndex:int − 表示リストから除く最後の子DisplayObjectインスタンスのインデックスを示す整数。負数や表示リストに納められたインスタンス数以上の値は、表示リストの最後のインスタンスまでとみなされる。デフォルト値は-1。

dispose:Booleantrueを渡すと、削除する子DisplayObjectインスタンスに含まれるデータはすべて破棄される。デフォルト値はfalse

戻り値 なし。

説明
DisplayObjectインスタンスのイベントリスナーすべてを消したいことがあります。とくに、インスタンスを表示リストから除いてメモリから消し去りたいときは、そのインスタンスに加えられたイベントリスナーはすべて削除しなければなりません。Starlingフレームワークには、そのためのメソッドがいくつか備わっています。

まず、DisplayObjectクラスが継承するEventDispatcherクラスには、EventDispatcher.removeEventListeners()メソッドがあります。引数にイベント定数の文字列を渡せば、そのイベントに加えられたイベントリスナーはすべて消し去られます。引数を省くかnullを渡すと、すべてのイベントとみなされます[*1]

つぎに、DisplayObjectクラスに備わるDisplayObject.dispose()メソッドは、インスタンスに含まれるデータをすべて破棄します。GPUバッファは開放され、内部的にEventDispatcher.removeEventListeners()メソッドが引数なしで呼出されます[*2]。したがって、インスタンスに加えられたイベントリスナーはすべてなくなります。ただし、使われているテクスチャ(Textureオブジェクト)は消されません[*3]

そして、DisplayObjectContainerクラスにも、DisplayObjectContainer.dispose()メソッドが備わっています。このメソッドはDisplayObjectContainerインスタンス自身だけでなく、子のDisplayObjectインスタンスに含まれるデータも破棄します[*4]。したがって、DisplayObjectContainer.dispose()メソッドを呼出せば、表示リストの階層のすべての子インスタンスのデータが消し去られます。

さらに、DisplayObjectContainerクラスの表示リストから子インスタンスを除くDisplayObjectContainer.removeChildAt()DisplayObjectContainer.removeChild()、およびDisplayObjectContainer.removeChildren()といったメソッドには、子インスタンスのデータを破棄する引数が与えられます[*5]。この引数を使えば、子インスタンスに対してDisplayObject.dispose()DisplayObjectContainer.dispose()メソッドを呼出す手間が省けます。

これらDisplayObjectインスタンスのイベントリスナーをすべて削除するメソッドは、メモリを開放するのに役立って便利です。ただし、もちろん必要なリスナーが含まれていないかを、予めよく確かめなければなりません。

[*1] EventDispatcherクラスにはEventDispatcher.removeEventListeners()メソッドがつぎのように定められています(ステートメント頭の番号は、ASファイルの行を示します。ただし、バージョンによって変わることがあります。以下同様)。

  1. private var mEventListeners:Dictionary;
  1. public function removeEventListeners(type:String=null):void
  2. {
  3.   if (type)
  4.     delete mEventListeners[type];
  5.   else
  6.     mEventListeners = null;
  7. }

イベントリスナーは、イベントごとにDictionaryオブジェクト(mEventListeners)に納めて管理されています(第37行目)。EventDispatcher.removeEventListeners()メソッドは、渡された引数に応じてリスナー関数群(Functionベース型のVectorオブジェクト)をDictionaryオブジェクトから除きます(第76〜79行目)。

[*2] DisplayObjectクラスにはDisplayObject.dispose()メソッドが、つぎのように定められています。DisplayObjectクラスにremoveEventListeners()というメソッドは備わっていませんので、継承するEventDispatcherクラスのEventDispatcher.removeEventListeners()が呼出されます(第140行目)。

  1. public class DisplayObject extends EventDispatcher
  2. {
  1.   public function dispose():void
  2.   {
  3.     removeEventListeners();
  4.   }
  1. }

[*3] Thibault Imbert『Introducing Starling』p.28をご参照ください。Textureオブジェクトからデータを消すには、Texture.dispose()メソッドを呼出します(TextureAtlasオブジェクトの場合はTextureAtlas.dispose())。

[*4] DisplayObjectContainerクラスは、override属性キーワードによりDisplayObjectクラスのdispose()メソッドを再定義(オーバーライド)しています。メソッドは、表示リストとなるVectorオブジェクト(mChildren)から取出したすべての子インスタンスに対してdispose()メソッドを呼出し(第79〜82行目)、さらにスーパークラスのDisplayObject.dispose()メソッドの呼出しも行います(第84行目)。

  1. public class DisplayObjectContainer extends DisplayObject
  2. {
  1.   private var mChildren:Vector.<DisplayObject>;
  1.   public override function dispose():void
  2.   {
  3.     var numChildren:int = mChildren.length;
  4.     
  5.     for (var i:int=0; i<numChildren; ++i)
  6.       mChildren[i].dispose();
  7.       
  8.     super.dispose();
  9.   }
  1. }

なお、子がDisplayObjectContainerインスタンスの場合に呼出されるのは、DisplayObjectContainer.dispose()メソッドになります(第82行目)。ですから結果として、表示リストの階層のすべての子に対して、dispose()メソッドの呼出しが行われるのです。

[*5] DisplayObjectContainer.removeChildAt()メソッドは、第2引数(dispose)にtrueが与えられると、表示リスト(mChildren)から取出した子インスタンス(child)のdispose()メソッドを呼出します(第131行目)。

  1. public function removeChildAt(index:int, dispose:Boolean=false):void
  2. {
  3.   if (index >= 0 && index < numChildren)
  4.   {
  5.     var child:DisplayObject = mChildren[index];
  6.     child.dispatchEvent(new Event(Event.REMOVED, true));
  7.     if (stage) child.dispatchEventOnChildren(new Event(Event.REMOVED_FROM_STAGE));
  8.     child.setParent(null);
  9.     mChildren.splice(index, 1);
  10.     if (dispose) child.dispose();
  11.   }
  12.   else
  13.   {
  14.     throw new RangeError("Invalid child index");
  15.   }
  16. }

DisplayObjectContainer.removeChild()は、引数に渡された子インスタンスのインデックスを調べたうえで、(インデックスが存在すれば)そのインデックスと自らが受取った第2引数をDisplayObjectContainer.removeChildAt()メソッドに渡して呼出します(第116〜117行目)。

  1. public function removeChild(child:DisplayObject, dispose:Boolean=false):void
  2. {
  3.   var childIndex:int = getChildIndex(child);
  4.   if (childIndex != -1) removeChildAt(childIndex, dispose);
  5. }

DisplayObjectContainer.removeChildren()メソッドもDisplayObjectContainer.removeChild()と同じように、削除するインデックスの子インスタンスに対してDisplayObjectContainer.removeChildAt()メソッドを呼出しています(第146〜147行目)。

  1. public function removeChildren(beginIndex:int=0, endIndex:int=-1, dispose:Boolean=false):void
  2. {
  3.   if (endIndex < 0 || endIndex >= numChildren)
  4.     endIndex = numChildren - 1;
  5.   
  6.   for (var i:int=beginIndex; i<=endIndex; ++i)
  7.     removeChildAt(beginIndex, dispose);
  8. }

参考
[Starling Framework Reference] > [EventDispatcher]
[Starling Framework Reference] > [DisplayObject]
[Starling Framework Reference] > [DisplayObjectContainer]


作成者: 野中文雄
作成日: 2012年3月25日


Copyright © 2001-2012 Fumio Nonaka.  All rights reserved.