2010-02-10 28 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