0

Flex 3 で簡単なアプリケーションを作成しました。コードは以下のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
    <![CDATA[

        private function browseFile():void
        {
            var fr:FileReference  = new FileReference();
            fr.addEventListener(Event.SELECT, onFileSelect);
            fr.browse();
        }

        private function onFileSelect(evt:Event):void
        {
            trace(evt.currentTarget);
        }


    ]]>
</mx:Script>
    <mx:Button click="browseFile()" />
</mx:Application>

ケースはEvent.SELECT決して解雇されないということです。しかし、frFileReference の参照をグローバルにする (つまり、関数の外部で宣言する) と、Event.SELECTが起動されます。これは Flex 3 でのみ発生することに注意してください。Flex 4 では、どちらの場合も問題なく動作します。Actionscriptのガベージコレクションメカニズムと何か関係がありますか? 誰か説明してくれませんか?その理由を知りたいだけです。

4

1 に答える 1

0

はい、ガベージコレクションと関係があります。fr( FileReference) 変数は関数内で宣言されているため、browseFile()その変数は関数内にのみ存在します。したがって、関数の実行が終了するとすぐにガベージ コレクションの対象となります。

Flex 4 で動作するように見えるという事実は少し奇妙ですが、ガベージ コレクションは Flash のスケジュールに従って行われることに注意してください。そのため、Flex 4 ではガベージ コレクションがすぐに行われない可能性があります (または、Flex 4 アプリのメモリ使用量がわずかに少ないため、ガベージ コレクションがそれほど迅速に行われない可能性があります)。Flex 4 のバグである可能性もあります。何かがFileReferenceオブジェクトへの参照を保持しているため、ガベージ コレクションが妨げられています。

于 2013-05-29T02:43:59.863 に答える