[*1] EventDispatcherクラスにはEventDispatcher.removeEventListeners()メソッドがつぎのように定められています(ステートメント頭の番号は、ASファイルの行を示します。ただし、バージョンによって変わることがあります。以下同様)。
- private var mEventListeners:Dictionary;
- public function removeEventListeners(type:String=null):void
- {
- if (type)
- delete mEventListeners[type];
- else
- mEventListeners = null;
- }
|
イベントリスナーは、イベントごとにDictionaryオブジェクト(mEventListeners)に納めて管理されています(第37行目)。EventDispatcher.removeEventListeners()メソッドは、渡された引数に応じてリスナー関数群(Functionベース型のVectorオブジェクト)をDictionaryオブジェクトから除きます(第76〜79行目)。
[*2] DisplayObjectクラスにはDisplayObject.dispose()メソッドが、つぎのように定められています。DisplayObjectクラスにremoveEventListeners()というメソッドは備わっていませんので、継承するEventDispatcherクラスのEventDispatcher.removeEventListeners()が呼出されます(第140行目)。
- public class DisplayObject extends EventDispatcher
- {
- public function dispose():void
- {
- removeEventListeners();
- }
- }
|
[*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行目)。
- public class DisplayObjectContainer extends DisplayObject
- {
- private var mChildren:Vector.<DisplayObject>;
- public override function dispose():void
- {
- var numChildren:int = mChildren.length;
-
- for (var i:int=0; i<numChildren; ++i)
- mChildren[i].dispose();
-
- super.dispose();
- }
- }
|
なお、子がDisplayObjectContainerインスタンスの場合に呼出されるのは、DisplayObjectContainer.dispose()メソッドになります(第82行目)。ですから結果として、表示リストの階層のすべての子に対して、dispose()メソッドの呼出しが行われるのです。
[*5] DisplayObjectContainer.removeChildAt()メソッドは、第2引数(dispose)にtrueが与えられると、表示リスト(mChildren)から取出した子インスタンス(child)のdispose()メソッドを呼出します(第131行目)。
- public function removeChildAt(index:int, dispose:Boolean=false):void
- {
- if (index >= 0 && index < numChildren)
- {
- var child:DisplayObject = mChildren[index];
- child.dispatchEvent(new Event(Event.REMOVED, true));
- if (stage) child.dispatchEventOnChildren(new Event(Event.REMOVED_FROM_STAGE));
- child.setParent(null);
- mChildren.splice(index, 1);
- if (dispose) child.dispose();
- }
- else
- {
- throw new RangeError("Invalid child index");
- }
- }
|
DisplayObjectContainer.removeChild()は、引数に渡された子インスタンスのインデックスを調べたうえで、(インデックスが存在すれば)そのインデックスと自らが受取った第2引数をDisplayObjectContainer.removeChildAt()メソッドに渡して呼出します(第116〜117行目)。
- public function removeChild(child:DisplayObject, dispose:Boolean=false):void
- {
- var childIndex:int = getChildIndex(child);
- if (childIndex != -1) removeChildAt(childIndex, dispose);
- }
|
DisplayObjectContainer.removeChildren()メソッドもDisplayObjectContainer.removeChild()と同じように、削除するインデックスの子インスタンスに対してDisplayObjectContainer.removeChildAt()メソッドを呼出しています(第146〜147行目)。
- public function removeChildren(beginIndex:int=0, endIndex:int=-1, dispose:Boolean=false):void
- {
- if (endIndex < 0 || endIndex >= numChildren)
- endIndex = numChildren - 1;
-
- for (var i:int=beginIndex; i<=endIndex; ++i)
- removeChildAt(beginIndex, dispose);
- }
|