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永远不会被解雇。但是,如果我fr对 FileReference 进行全局引用(即在任何函数之外声明它),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 回答