EventDispatcher#addEventListener 使うとき、useWeakReference は基本 true に設定した方が良いようなので、まずは弱参照の使用例についてメモ。
Dictionary を作るとき、コンストラクタに true 渡すだけ、のハナシなんですが。
とりあえず実験。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" applicationComplete="init()"> <mx:Script> <![CDATA[ private var dic:Dictionary = new Dictionary(true);//弱参照設定 private var keyObject:Object = new Object(); private function init():void { dic[keyObject] = "foo";//キーに keyObject を使う traceDic(); } private function clickHandler():void { trace("---clickHandler start---"); keyObject = null; // キーのオブジェクトの参照を外す //delete dic[keyObject]; ただし、連想配列からそのキーの削除はしない System.gc(); // GC 呼ぶ traceDic(); trace("---clickHandler end---"); } private function traceDic():void { for each (var item:Object in dic) { trace("dicItem"+item); } } ]]> </mx:Script> <mx:Button click="clickHandler()" /> </mx:Application>
実行結果。
dicItemfoo
---clickHandler start---
---clickHandler end---
こうなる。環境によって GC のタイミング次第なところもあるんで、必ずしもこうなるとは限らないと思うけど。一応、弱参照の理屈通りの動作になっていることが確認できた。