【问题标题】:Flash Memory Leak Problem闪存泄漏问题
【发布时间】:2023-03-10 19:40:02
【问题描述】:

我在下面的例子中遇到了内存泄漏问题(你可以从链接下载代码)

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

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

(创建几个面板并关闭这些面板后,我发现 SuperPanel 类存在内存泄漏)

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

【问题讨论】:

  • 为什么不直接在这里发布代码,而不是让你寻求帮助的人做额外的工作?

标签: flash memory memory-leaks


【解决方案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);

此外,您还没有覆盖SuperPanelEvent 中的clone 事件,这将导致您以后出现问题。 See this question for more details.

【讨论】:

  • 嘿,它的部分工作很棒。那是当我关闭第一个 oppup 并运行 GC 时,它不会删除该实例。它正在从下一个删除。那就是我总是有 1 个额外的实例,它应该是。你能告诉我在哪里改变
  • 这是 (IIRC) UIComponent 类中的一个错误,它在不应该保留引用时保留引用。我会尝试为您找到一篇解释它的文章,但至少您的记忆会被清理干净(尽管比您想要的稍晚)。旁注:你不应该自己调用 GC。
  • 嘿,理查德,你的解决方案真的帮了我很多。我从 2 天开始就在尝试这个解决方案。非常感谢。
  • @Fresher4Flex - 不用担心。如果您认为我的回答能帮助您解决问题,您可以通过单击问题左侧的“打勾”将其标记为“答案”。
猜你喜欢
  • 1970-01-01
  • 2016-07-28
相关资源
最近更新 更多