Dictionaryでガベージコレクションがうんたらかんたら
fladdictさんのガベージコレクションに関するエントリーがなんとも食指をくすぐったので試してみた。
http://fladdict.net/blog/2008/04/as3_19.html
弱参照のDictionaryのオブジェクトキーを利用して、対象のオブジェクトがガベッジコレクションされたかどうかを見張ることができるんじゃね??
デバッグモードでなくてもそこらへんが監視できるユーティリティがあるとすごく便利。
まずは検証...
FlexBuilder3のプロファイリングと見比べつつ、ガベージコレクションの挙動を確認してみる。いろいろ試しているうちにたどり着いた最終的なコードは以下。なんかカスタムクラスでないとうまくサンプリングされないのでExtSpriteを定義してます。
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.text.TextField;
import flash.utils.Dictionary;
public class OverrideTest extends Sprite
{
private var tf:TextField;
private var dic:Dictionary;
public function OverrideTest()
{
tf = addChild(new TextField()) as TextField;
tf.autoSize = "left";
dic = new Dictionary(true);
stage.addEventListener(MouseEvent.CLICK,createObject);
addEventListener(Event.ENTER_FRAME,watchDictionary);
}
private function createObject(event:MouseEvent):void
{
for(var i:int=0;i<100;i++){
var sp:Sprite = new ExtSprite(); // GCされない
dic[sp.name] = sp;
new ExtSprite(); // こっちはGCされる
}
}
private function watchDictionary(event:Event):void
{
var i:int=0;
for(var j:String in dic){
i++;
}
tf.text = i+"";
}
}
}
import flash.display.Sprite;
class ExtSprite extends Sprite
{
}
ここでなんとも腑に落ちないことが...
なんか弱参照のDictionaryでもガベージコレクションされないんですが。。。

いちおう起動中のアプリケーションも並べてますが、Dictionaryにつっこんだ数と残ってるオブジェクトの数が一致!コレってガベージコレクションされてないよね。これだといろんな事が覆ってしまって不味いと思うんですが、自分のコード、もしくは実行環境(デバッグプレイヤー?)が悪いんでしょーか?よー分からんです。
誰か!
弱参照のDictionaryならちゃんとガベージコレクションされるんだよね。ツッコミお願いします。


コメントする