我开发了第一个使用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类的对象无效,否则垃圾收集器将处理它。如果我需要明确地废除它,那么在哪里做。
由于
答案 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
欢呼声