Spark Comboボックスに関連する単純で再現可能なメモリリークがありますが、SDKのバグではなく、間違っていることが原因であると確信しています。
// Application.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">
<s:layout>
<s:VerticalLayout />
</s:layout>
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
private var hasElement:Boolean;
protected function toggleContainer():void
{
if (hasElement)
{
button.setFocus();
comboBoxContainer.removeAllElements();
hasElement = false;
} else {
var vew:ComboBoxView = new ComboBoxView();
comboBoxContainer.addElement(vew);
hasElement = true;
}
}
]]>
</fx:Script>
<s:Button id="button" label="Add container" click="toggleContainer()" />
<s:Group id="comboBoxContainer" />
</s:Application>
// ComboBoxView.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
>
<s:ComboBox />
</s:VGroup>
Flex 4.1に対してコンパイルすると、メモリリークが発生し、ComboBoxへの参照が長引くためにComboBoxViewがGCされることはありません。
プロファイラーからの出力は次のとおりです。
再現する手順:
Application.mxml
およびを使用してプロジェクトを作成するComboBoxView.mxml
- Flex4.1を使用してプロジェクトをコンパイルします
- プロファイラーを使用してApplication.mxmlを起動します
- メモリスナップショットを作成する
- ボタンをクリックして、ビューをステージに追加します
- ボタンをもう一度クリックして、ステージからビューを削除します
- ガベージコレクターを実行します
- 別のメモリスナップショットを作成する
- 2つのメモリスナップショットの間に残っているオブジェクトを表示する
注-これは、アプリケーションがFlexHeroに対してコンパイルされている場合は発生しません。
これはバグのように見えますが、ComboBoxにメモリリークがあるとは信じられません。確かに、4.1が出荷される前にこれは修正されていたでしょうか。
私はここで何が間違っているのですか?ビューがGCされないのはなぜですか?
更新 私はこれについてさらに調査を行いましたが、問題はComboBoxSkinが使用するRichEditableTextコンポーネントの問題にあると考えています。詳細はこちらをご覧ください: Sparkメモリリーク