消去処理 - sipo/gipo GitHub Wiki
インスタンスの参照を解除してメモリを開放するのは忘れがちな処理です。
忘れがちな理由は、消去処理が生成処理とは別の場所に書かれることが多いためです。別の場所に書かれることで、単純な忘れミス以外にも、呼び出しのミスや修正時に片方だけを消去したりというミスが発生します。
Gipoフレームワークでは、生成と同時に消去処理を予約することができます。
bgLayer = new Sprite();
layer.addChild(bgLayer);
gear.disposeTask(function () layer.removeChild(bgLayer));
最後の行を少し丁寧に記述すると以下になります。
gear.disposeTask(
function ():Void
{
layer.removeChild(bgLayer);
}
);
gear.disposeTask()
関数に登録された処理は、そのNodeが親から removeChild
された時に、実行されます。複数登録されている場合は、登録の逆順で実行されます。また、Nodeは親から切り離されると自動的にその子全てが切り離されるため、全ての子Nodeで消去処理が動作することになります。
このように生成時に必ず消去処理も併記するという形で、メモリーリークを防止できます。
disposeTaskの注意点
- 利用するフレームワークに既に固有の消去処理がある場合、処理が衝突したり無駄な処理が発生します。例えば、Starlingフレームワークには、親がremoveされた場合に子も全てremoveされる消去処理があるため、StarlingフレームワークのdisplayObjectに対してはdisposeTaskは必要ありません。
- 匿名関数を登録するとクロージャーによってメモリの保持が発生します。これを避けたい場合は、privateなメンバ関数を作成し、それを登録するようにするか、生成と消去予約を個別のメンバ関数で行うようにし、クロージャーに余計なインスタンスが登録されないようにします。