我们有一个使用多个模块的巨大的flex应用程序。加载和卸载模块的长时间使用存在巨大的内存泄漏问题。
根据所有的搜索和不同的文章,我了解到我需要在卸载时清理对象,删除事件侦听器,停止计时器和处置任何引用。
我一开始是在一个模块中一次选择一个组件。
这就是它的结构。
有一个父应用程序加载一个模块,该模块有多个视图。该组件在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);
}现在,当我运行profiler并在模块之间切换时,这个组件的实例数量仍然在继续增长。我在profiler上单击了GC Collect,但实例仍然保留。
在作为模块mxml的父容器上,我还尝试在卸载模块时编写以下代码行:
//function call to invoke dispose as above
component1.dispose();
component1 = null;请帮帮忙。我不确定我在这里遗漏了什么,或者这是不是正确的方法。
谢谢。
发布于 2013-09-12 02:36:10
这不会解决你的问题,但我希望它能有所帮助。
希望这能帮上忙。
发布于 2013-09-12 16:05:20
Flash并不总是启动内存清理方法,但它只在你过度占用内存时释放空指针,所以要注意这一障碍。
发布于 2013-09-13 13:46:19
您可能希望尝试不同的容器。我个人在使用VBox时遇到过性能问题。正如之前的用户所说,Flex有一个习惯,就是等到内存达到较高水平后才执行内存清理。
https://stackoverflow.com/questions/18745640
复制相似问题