我刚注意到一个奇怪的行为,同时在Flash Profiler中查看我的应用程序。当我在TitleWindow中单击一个按钮时,TitleWindow在删除后不会被垃圾收集。我不知道为什么会这样。组件不会被垃圾收集
我创建了一个小示例应用程序,所以你可以尝试一下自己:
Main.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" pageTitle="Memory Leak (Spark)">
<fx:Script>
<![CDATA[
protected function openWindowBtn_clickHandler():void
{
removeAllElements();
addElement(new ExampleView());
}
]]>
</fx:Script>
<s:controlBarContent>
<s:Button label="Open Window" id="openWindowBtn" click="openWindowBtn_clickHandler()"/>
</s:controlBarContent>
</s:Application>
ExampleView.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" width="100%" height="100%" title="Example View" close="closeHandler()">
<fx:Script>
<![CDATA[
import mx.core.IVisualElementContainer;
protected function closeHandler():void
{
var visualElementParent:IVisualElementContainer = parent as IVisualElementContainer;
if (visualElementParent)
visualElementParent.removeElement(this);
else
parent.removeChild(this);
}
]]>
</fx:Script>
<s:layout>
<s:VerticalLayout verticalAlign="middle" horizontalAlign="center"/>
</s:layout>
<s:Button id="doSomethingBtn" label="Click me!"/>
</s:TitleWindow>
当您单击“打开窗口”并关闭示例视图,而不点击“点击我!”按钮,然后GC启动并删除ExampleView。但是,当您点击“点击我!”时然后关闭ExampleView,ExampleView永远留在内存中。
我无法在Profiler中找到导致此行为的引用。我希望有人知道这个解决方案,否则Flex会造成大量内存泄漏。
进一步测试后,它看起来像这样只发生一次。因此,如果您执行三个步骤(打开窗口,单击“单击我”,关闭窗口)三次,只有一个TitleWindow实例不会被垃圾收集。 – 2010-10-18 11:45:48