我有一个与 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 编译时,这似乎会造成内存泄漏,其中 ComboBoxView 永远不会被 GC 处理——因为对 ComboBox 的持续引用。
这是分析器的输出:
重现步骤:
Application.mxml
使用and创建一个项目ComboBoxView.mxml
- 使用 Flex 4.1 编译项目
- 使用分析器启动 Application.mxml
- 创建内存快照
- 单击按钮将视图添加到舞台
- 再次单击该按钮以从舞台上移除视图
- 运行垃圾收集器
- 创建另一个内存快照
- 查看两个内存快照之间的延迟对象
注意 - 当应用程序针对 Flex Hero 编译时不会发生这种情况。
看起来好像这是一个错误,但我无法相信 ComboBox 有内存泄漏——这肯定会在 4.1 发布之前修复吗?
我在这里做错了什么?为什么视图没有被 GC 处理?
更新 我已经对此进行了进一步调查,并认为问题在于 ComboBoxSkin 使用的 RichEditableText 组件存在问题。在此处查看详细信息: Spark 内存泄漏