kagamihogeの日記

kagamihogeの日記です。

Flex の Dictionary を弱参照で使う

EventDispatcher#addEventListener 使うとき、useWeakReference は基本 true に設定した方が良いようなので、まずは弱参照の使用例についてメモ。

結合配列 - Adobe Flex 3 ヘルプ

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 のタイミング次第なところもあるんで、必ずしもこうなるとは限らないと思うけど。一応、弱参照の理屈通りの動作になっていることが確認できた。