2010-02-10 31 views
1

我有在下面的例子中的内存泄漏问题(U可以从链接的代码)闪存内存泄漏问题

http://brandonmeyer.net/projects/SuperPanelDemo/SuperPanelDemo.html

在Profiler运行: - 我所试图做的是通过选择添加新面板按钮来创建新面板。 我正在选择允许关闭选项(复选框)。

(创建几个板和关闭这些面板我能找到后有内存泄漏与SuperPanel类)

所以我的问题是如何解决这个内存泄漏。我尝试通过更改addEventListener中的可选参数,但这没有奏效。有人可以提供我的解决方案

+1

为什么不直接在这里发布代码,而不是让你要求帮助的人做额外的工作? – Oded 2010-02-10 08:15:28

回答

1

我认为你的问题与你的绑定有关。 BindingUtils.bindProperty正在被给予你的panel实例,试图将其用于对象图并使其不适用于垃圾收集。

bindProperty返回一个ChangeWatcher,当您完成该操作时,您可以使用它来取消注册绑定。像下面这样:

var watchers : Array = []; 

var panel:SuperPanel = new SuperPanel(); 
panel.width = 300; 
panel.height = 200; 
panel.minWidth = 200; 
panel.minHeight = 100; 

panel.title = "My Panel " + (panelContainer.numChildren + 1); 
panel.addEventListener(CloseEvent.CLOSE, function(event:CloseEvent):void{ 
    for each(var watcher : ChangeWatcher in watchers) { 
     watcher.unwatch(); 
    } 

    event.target.parent.removeChild(event.target); 
}); 

watchers.push(BindingUtils.bindProperty(panel, "allowDrag", allowDragCheck, "selected")); 
watchers.push(BindingUtils.bindProperty(panel, "allowResize", allowResizeCheck, "selected")); 
watchers.push(BindingUtils.bindProperty(panel, "allowClose", allowCloseCheck, "selected")); 
watchers.push(BindingUtils.bindProperty(panel, "allowMaximize", allowMaxCheck, "selected")); 
watchers.push(BindingUtils.bindProperty(panel, "allowMinimize", allowMinCheck, "selected")); 

panelContainer.addChild(panel); 

此外,你还没有覆盖在SuperPanelEventclone事件后来会引起你的问题。 See this question for more details

+0

嘿它的伟大其部分工作。那就是当我关闭第一个oppup并运行GC时,它不会删除那个实例。它正在从下一个移除。 这就是我总是有一个额外的实例,它应该是。可以告诉我在哪里更改 – Fresher4Flex 2010-02-11 07:30:41

+0

这是(IIRC)UIComponent类中的一个错误,它在不应该时保留引用。我会尽力为你找到一篇解释它的文章,但至少你的记忆会被清理干净(尽管比你想要的稍晚)。附注:你不应该自己打电话给GC。 – 2010-02-11 08:53:32

+0

嘿理查德,你的解决方案真的帮了我很多。我从2天开始尝试这个解决方案。非常感谢你。 – Fresher4Flex 2010-02-11 17:15:36