我在下面的例子中遇到了内存泄漏问题(你可以从链接下载代码)
http://brandonmeyer.net/projects/SuperPanelDemo/SuperPanelDemo.html
在Profiler中运行: - 我想要做的是通过选择添加新面板按钮创建新面板。 我选择选项允许关闭(复选框)。
(创建几个面板并关闭这些面板后,我发现SuperPanel类存在内存泄漏)
所以我的问题是如何解决这个内存泄漏问题。我尝试通过更改addEventListener中的可选参数,但这不起作用。有人能为我提供解决方案
答案 0 :(得分: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);
此外,您还没有覆盖clone
中的SuperPanelEvent
事件,这会导致您稍后出现问题。 See this question for more details