デストラクタを定義する

生成したオブジェクトを破棄するには delete ステートメントを使用すればよいが、delete ステートメントによる削除の対象は、生成したオブジェクトの実体ではなく、オブジェクトの参照であることに注意したい。唯一、実体として扱われるのは「そのオブジェクトが、他のいかなるオブジェクトにも参照されていない」ときだけである。オブジェクトは完全に孤独にならない限り、生かされ続ける運命にある。プログラマがオブジェクトの生存管理を怠ると、行き場を失ったオブジェクトは思わぬ所でバグを発生させるだろう。用済みのオブジェクトは大人しく退場して貰った方がよい。

以下のコードでは、hogeRef の存在により、hoge を削除しても実体は残ってしまう。

var hoge:Hoge = new Hoge();
var hogeRef:Hoge = this.hoge;
delete this.hoge;

不要になったオブジェクトを "見かけ上" 確実に破棄する方法として、デストラクタを定義する案が考えられる。destroy() や free() といったメソッドをクラスに定義し、delete ステートメントでオブジェクトを破棄する直前にメソッドを呼べばよい。"見かけ上" というのは、デストラクタが、単に「オブジェクトを機能させなくする」為でしか無いからだ。もし、デストラクタを呼び出し後の delete ステートメントの対象が、運悪くオブジェクト参照だった場合は、ゾンビとなった実体が幾らかのメモリを消費し続けるだろう。

以下のコードは、デストラクタの実装の一例である。全てのプロセスを停止し、全てのプロパティと公開メソッドを無効にしている。

class Hoge {
private var intervalID:Number = null;
private var counter:Number = 0;
/**
*  コンストラクタ
*/
public function Hoge() {
}

/**
*  デストラクタ
*/
public function destroy():Void {
this.stop();
this.counter = null;
this.intervalID = null;
this.start = null;
this.stop = null;
}

/**
*  タイマーを開始する
*/
public function start():Void {
this.stop();
this.intervalID = setInterval(this, "count", 1000);
}
/**
*  タイマーを停止する
*/
public function stop():Void {
clearInterval(this.intervalID);
}
/**
*  内部カウンタを増やす
*/
private function count():Void {
this.counter++;
trace(this.counter);
}
}