2011-09-08 54 views
0

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

我不知道在哪里可以删除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类的对象。如果我需要明确地取消它,在哪里做到这一点。

谢谢

回答

1

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

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

我建议你多阅读一下垃圾回收以及一些整洁的技巧,比如池化和虚拟化(列表中的项目渲染器)。

+0

嗨J_A_X,如何以及在哪里删除事件监听器和无效引用变量的位置。你能举个例子吗? –

+0

我不能展示一个例子,因为它取决于你想要完成的行为。就像调用'removeEventListener'一样简单,使用'removeElement'从显示列表中移除并执行'yourVar = null;'。 –

+0

谢谢J_A_X,我会这么做 –

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

欢呼

+0

使用弱引用是因为1)它鼓励潦草编码和2)标记和清理垃圾收集比引用计数慢(即当你清理你自己的事件侦听器) –