我们有一个使用多个模块的巨大弹性应用程序。长时间使用加载和卸载模块存在巨大的内存泄漏问题。
根据所有搜索和不同的文章,我了解到我需要在卸载时清理对象、删除事件侦听器、停止计时器并处理任何引用。
我通过在其中一个模块中一次拿起一个组件来开始这一点。
这是它的结构。
有一个父应用程序加载一个具有多个视图的模块。该组件在 mxml 中定义,并在视图堆栈的 mxml 模块中被引用。
这个 mxml 组件是一个添加了事件侦听器的 VBox -
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
paddingTop="10"
paddingLeft="10"
paddingBottom="10"
paddingRight="10"
creationComplete="onInit()"
show="onShow()"
resize="onResize(event)" ....
有几个属性是从 mxml 中的父容器绑定的。除了上述侦听器之外,还有一个从外部访问的私有变量 -
[Bindable]
private var _model:SModelLocator=SModelLocator.GetInstance();
在卸载模块时,我在此组件中调用 dispose 函数,如下所示 -
public function dispose():void
{
this.removeEventListener(FlexEvent.CREATION_COMPLETE,onInit);
this.removeEventListener(FlexEvent.SHOW,onShow);
this.removeEventListener(ResizeEvent.RESIZE,onResize);
var arr:Array = this.getChildren();
for(var i:int = 0; i<arr.length;i++)
delete arr[i];
this.removeAllChildren();
_model = null;
//Properties that are binded from the parent container
Property1 = null;
Property2 = null;
this.deleteReferenceOnParentDocument(this.parentDocument as IFlexDisplayObject);
}
现在,当我运行分析器并在模块之间切换时,该组件的实例数量仍在继续增长。我在分析器上单击了 GC Collect,但实例仍然存在。
在模块 mxml 的父容器上,我还尝试在卸载模块时编写以下行 -
//function call to invoke dispose as above
component1.dispose();
component1 = null;
请帮忙。我不确定我在这里缺少什么,或者即使这是正确的方法。
谢谢。