flex移动项目:内存管理

时间:2011-09-08 12:14:52

标签: flex memory-management

我开发了第一个使用TabbedViewNavigatorApplication的flex移动应用程序。应用程序工作正常但是当我在“配置文件处理程序”中测试应用程序时,随着我在应用程序中导航,内存使用量不断增加。当我开始知道这一点时,我必须删除所有添加的eventlisteners,并且我必须使不再需要的对象无效。当我在标签之间切换时,标签会一次又一次地初始化。

我不知道在哪里可以删除eventlisteners。我的意思是,我为每个eventlisteners编写了函数。当控制转到函数定义时,是否需要删除eventlistener。

我已经编写了示例代码

  var more:Image = new Image();
    more.width = 70;
    more.height=29;
    more.x=10;
    more.y=276;
    more.source = "Assets/more button.png";
    more.addEventListener(MouseEvent.CLICK, MORE_clickHandler);
    mainGroup.addElement(more);



private function MORE_clickHandler(e:MouseEvent):void {

// Do I need to remove the eventlistener here

}

另外,我是否需要显式地使我创建的Image类的对象无效,否则垃圾收集器将处理它。如果我需要明确地废除它,那么在哪里做。

由于

2 个答案:

答案 0 :(得分:1)

垃圾收集是任何语言的重要组成部分,尤其是在移动设备上。由于移动设备比我们的桌面设备更受限制,因此您需要非常小心创建/存储到内存中的内容。我的座右铭是,如果你没有看到它,你就不应该保留它。您可以使用视图模型销毁视图但保持其状态。

要删除视图,您需要先从显示列表中删除它(removeElement(yourObject)),删除所有事件侦听器,并使任何引用变量无效。如果任何变量仍然有引用它,它将不会被垃圾收集。

我建议你多读一些关于垃圾收集的内容以及一些简洁的技巧,比如池和虚拟化(列表中的项目渲染器)。

答案 1 :(得分:0)

您可以使用弱引用设置事件侦听器。

这意味着当对象的唯一引用是侦听器时,对象本身仍然可以被垃圾收集,并且侦听器不会将其保留在内存中。

以下将解决这个问题:

more.addEventListener(MouseEvent.CLICK, MORE_clickHandler,false, 0, true);

另一种选择是对图像类进行子类化并让它实现IDisposable接口,这将迫使您实现dispose()方法。

一些方便的资源:
http://www.intriguemedia.net/2007/09/24/when-to-use-weak-references
http://gskinner.com/blog/archives/2006/07/as3_weakly_refe.html

欢呼声