Току-що забелязах странно поведение, докато разглеждах приложението си във 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, без да щракнете върху "Щракнете върху мен!" бутон в него, тогава GC се включва и премахва ExampleView. Въпреки това, когато щракнете върху "Щракнете ме!" и затворете ExampleView след това, ExampleView остава в паметта завинаги.
Не успях да намеря препратките в Profiler, които причиняват това поведение. Надявам се някой да знае решение за това, в противен случай Flex създава много течове на памет.