Я только что заметил странное поведение, глядя на свое приложение во 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>
Когда вы нажимаете «Открыть окно» и закрываете ExampleView, не нажимая «Click me!» нажмите кнопку, затем включится сборщик мусора и удалит ExampleView. Однако, когда вы нажимаете на «Щелкни меня!» а затем закройте ExampleView, ExampleView останется в памяти навсегда.
Мне не удалось найти в профилировщике ссылки, которые вызывают такое поведение. Я надеюсь, что кто-то знает решение этой проблемы, иначе Flex создаст много утечек памяти.