« links for 2011-08-07 | Home | links for 2011-08-08 »

Aug 082011

disposeしたbitmapDataの確認

embedしたbitmapDataを再度使用したい時、dispose自体はnullにする動作では無いために、bitmapDataインスタンスは存在した状態になっている。つまり

var bmd:BitmapData = new Image();
bmd.dipose();
if(bmd)var bm:Bitmap = new Bitmap(bmd);

ってなやり方では、しれっと何も表示されないので、以下のように例外処理を利用して判定する。

var bmd:BitmapData = new Image();
bmd.dipose();
try {
	_bmd.width;
}
catch (e:Error) {
	_bmd= new Image();
}
var bm:Bitmap = new Bitmap(bmd);

ちなみにdisposeの挙動としては

BitmapData.dispose() は、実際のビットマップデータが占めていたメモリ領域を即時に解放します(ビットマップは最大で 64MB のメモリ領域を使用します)。BitmapData.dispose() を使用した後は BitmapData オブジェクトを使用できなくなり、BitmapData オブジェクトに対して関数を呼び出すと、Flash ランタイムから例外が返されます。ただし、BitmapData.dispose() では BitmapData オブジェクト(約 128 バイト)のガベージコレクションは行われません。実際の BitmapData オブジェクトが占めていたメモリ領域は、ガベージコレクターによって BitmapData オブジェクトが回収された時点で解放されます。
な感じになっている。
ま、今更なんの話だ?っつー感じではあるのだけど・・・

もし汎用的に参照する必要があるのであればgetter化してしまえばいい。

[Embed(source='../../src/404.png')]
private static var _BM404:Class;
private static var _BMD404:BitmapData;
private function get IMG404():BitmapData {
	try {
		_BMD404.width;
	}
	catch (e:Error) {
		_BMD404 = (new _BM404() as Bitmap).bitmapData;
	}
	return _BMD404;
}
こんなの。 しらんけど

Leave a comment

Search and Archives