You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@flex.apache.org by Paul Stearns <pa...@compuace.com.INVALID> on 2019/02/01 18:13:24 UTC
instances of objects magically appear...
I am trying to solve my memory leak issue. I have added a clearEvents function to my testing modules. My thought is to execute this function prior to unloading each module. Towards that end I have created a function in the parentApplication called clearModuleEvents which recursively loops through each child, and if the "clearEvents " function exists, run it. Then I unload the module.
Using the profiler when I execute clearModuleEvents, it seems to create another instance of each display object. I am not sure why. I would appreciate if someone might tell what might cause that.
Here is the code referenced above;
clearEvents & related code;
protected var dctListeners:Dictionary = new Dictionary(); override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = true):void { var key:Object = {type: type, useCapture: useCapture}; if (dctListeners[key]) { removeEventListener(type, dctListeners[key], useCapture); dctListeners[key] = null; } dctListeners[key] = listener; super.addEventListener(type, listener, useCapture, priority, useWeakReference); } public function clearEvents():void { trace('TestMemoryLeak clearEvents'); try { for (var key:Object in dctListeners) { removeEventListener(key.type, dctListeners[key], key.useCapture); dctListeners[key] = null; } } catch (e:Error) { trace('TestMemoryLeak clearEvents error='+e.message); } dctListeners = null; }
clearModuleEvents and related code
public function clearModuleEvents(mdlModule:UIComponent):void
{ trace('Starting clearModuleEvents') for(var idx:int = mdlModule.numChildren - 1; idx >= 0; idx--) { trace('idx=' + idx + ' isContainer(objChild)=' +isContainer(objChild) + ' isContainer(mdlModule.getChildAt(idx))=' + isContainer(mdlModule.getChildAt(idx))); var objChild:DisplayObject = mdlModule.getChildAt(idx); trace('flash.utils.getQualifiedClassName(objChild)=' + flash.utils.getQualifiedClassName(objChild)); var childContainer:DisplayObjectContainer = objChild as DisplayObjectContainer; clearChildEvents(childContainer); childContainer = null; if ("clearEvents" in objChild) { var fncClearEvents:Function = objChild["clearEvents"]; if (objChild.hasOwnProperty('id')) trace('Clearing Events in==>>' + objChild['id']); fncClearEvents(); fncClearEvents = null; } if ("dataProvider" in objChild)objChild["dataProvider"] = null; if ("selectedIndex" in objChild)objChild["selectedIndex"] = -1; if ("selectedItem" in objChild)objChild["selectedItem"] = null; if ("value" in objChild)objChild["value"] = null; if ("text" in objChild)objChild["text"] = null; objChild = null; } objChild = null; trace('Finished clearModuleEvents')
}
private function clearChildEvents(dpsContainer:DisplayObjectContainer):void
{ for(var idx:int = dpsContainer.numChildren - 1; idx >= 0; idx--) { var objChild:DisplayObject = dpsContainer.getChildAt(idx); if (isContainer(objChild)) { var childContainer:DisplayObjectContainer = objChild as DisplayObjectContainer; clearChildEvents(childContainer); childContainer = null; } if ("killMe" in objChild) { var fncKillMe:Function = objChild["killMe"]; if (objChild.hasOwnProperty('id')) trace('Killing Events in==>>' + objChild['id']); fncKillMe(); fncKillMe = null; } else if ("clearEvents" in objChild) { var fncClearEvents:Function = objChild["clearEvents"]; if (objChild.hasOwnProperty('id')) trace('Clearing Events in==>>' + objChild['id']); fncClearEvents(); fncClearEvents = null; } if ("dataProvider" in objChild)objChild["dataProvider"] = null; if ("selectedIndex" in objChild)objChild["selectedIndex"] = -1; if ("selectedItem" in objChild)objChild["selectedItem"] = null;
// if ("value" in objChild)objChild["value"] = null; if ("text" in objChild)objChild["text"] = null; objChild = null; } objChild = null;
}
Re: instances of objects magically appear...
Posted by Alex Harui <ah...@adobe.com.INVALID>.
It was hard to read the code in the email. In the future, try using pastebin or some other service, or open a JIRA issue and put the code in there.
I think I saw that a Dictionary was holding the children but it isn't a weak-reference dictionary, so that could pin those children in memory.
HTH,
-Alex
On 2/1/19, 10:16 AM, "Paul Stearns" <pa...@compuace.com.INVALID> wrote:
I am trying to solve my memory leak issue. I have added a clearEvents function to my testing modules. My thought is to execute this function prior to unloading each module. Towards that end I have created a function in the parentApplication called clearModuleEvents which recursively loops through each child, and if the "clearEvents " function exists, run it. Then I unload the module.
Using the profiler when I execute clearModuleEvents, it seems to create another instance of each display object. I am not sure why. I would appreciate if someone might tell what might cause that.
Here is the code referenced above;
clearEvents & related code;
protected var dctListeners:Dictionary = new Dictionary(); override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = true):void { var key:Object = {type: type, useCapture: useCapture}; if (dctListeners[key]) { removeEventListener(type, dctListeners[key], useCapture); dctListeners[key] = null; } dctListeners[key] = listener; super.addEventListener(type, listener, useCapture, priority, useWeakReference); } public function clearEvents():void { trace('TestMemoryLeak clearEvents'); try { for (var key:Object in dctListeners) { removeEventListener(key.type, dctListeners[key], key.useCapture); dctListeners[key] = null; } } catch (e:Error) { trace('TestMemoryLeak clearEvents error='+e.message); } dctListeners = null; }
clearModuleEvents and related code
public function clearModuleEvents(mdlModule:UIComponent):void
{ trace('Starting clearModuleEvents') for(var idx:int = mdlModule.numChildren - 1; idx >= 0; idx--) { trace('idx=' + idx + ' isContainer(objChild)=' +isContainer(objChild) + ' isContainer(mdlModule.getChildAt(idx))=' + isContainer(mdlModule.getChildAt(idx))); var objChild:DisplayObject = mdlModule.getChildAt(idx); trace('flash.utils.getQualifiedClassName(objChild)=' + flash.utils.getQualifiedClassName(objChild)); var childContainer:DisplayObjectContainer = objChild as DisplayObjectContainer; clearChildEvents(childContainer); childContainer = null; if ("clearEvents" in objChild) { var fncClearEvents:Function = objChild["clearEvents"]; if (objChild.hasOwnProperty('id')) trace('Clearing Events in==>>' + objChild['id']); fncClearEvents(); fncClearEvents = null; } if ("dataProvider" in objChild)objChild["dataProvider"] = null; if ("selectedIndex" in objChild)objChild["selectedIndex"] = -1; if ("selectedItem" in objChild)objChild["selectedItem"] = null; if ("value" in objChild)objChild["value"] = null; if ("text" in objChild)objChild["text"] = null; objChild = null; } objChild = null; trace('Finished clearModuleEvents')
}
private function clearChildEvents(dpsContainer:DisplayObjectContainer):void
{ for(var idx:int = dpsContainer.numChildren - 1; idx >= 0; idx--) { var objChild:DisplayObject = dpsContainer.getChildAt(idx); if (isContainer(objChild)) { var childContainer:DisplayObjectContainer = objChild as DisplayObjectContainer; clearChildEvents(childContainer); childContainer = null; } if ("killMe" in objChild) { var fncKillMe:Function = objChild["killMe"]; if (objChild.hasOwnProperty('id')) trace('Killing Events in==>>' + objChild['id']); fncKillMe(); fncKillMe = null; } else if ("clearEvents" in objChild) { var fncClearEvents:Function = objChild["clearEvents"]; if (objChild.hasOwnProperty('id')) trace('Clearing Events in==>>' + objChild['id']); fncClearEvents(); fncClearEvents = null; } if ("dataProvider" in objChild)objChild["dataProvider"] = null; if ("selectedIndex" in objChild)objChild["selectedIndex"] = -1; if ("selectedItem" in objChild)objChild["selectedItem"] = null;
// if ("value" in objChild)objChild["value"] = null; if ("text" in objChild)objChild["text"] = null; objChild = null; } objChild = null;
}