git.net

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Memory Leak


Hi,

I might be missing something, but AFAICT, even if all of that works perfectly, you still don't know if your code has caused some Flex framework code to attach a listener to the stage, a Timer, a network class, etc.  IOW, I think you can run code like:

import mx.controls.ComboBox;
var cb:ComboBox = new ComboBox();
addChild(cb);
trace(cb.dropDown);

IIRC, simple code like this can pin a module into memory, and your clean up code won't catch it.

HTH,
-Alex

On 5/24/18, 1:30 PM, "aceinc" <pauls@xxxxxxxxxxxx> wrote:

    Alex, I have implemented the code to destroy event listeners in all of my
    widgets, as well as the calling class. The calling class is called from the
    root as a module. Before unloading the module I do the following to try and
    remove all event listeners;
    
    private function clearModuleEvents(mdlModule:ModuleLoader):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);
    		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;
        }
        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);
    		}
    		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;
    		objChild = null;
        }
    }
    
    
    
    
    
    --
    Sent from: https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fapache-flex-users.2333346.n4.nabble.com%2F&data=02%7C01%7Caharui%40adobe.com%7C110b4012ca394ee4b27b08d5c1b53108%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636627906328800733&sdata=DIbMjs4iq5lHDN1NDhD8dKXQI9vdXxp71xlu4VcW9ys%3D&reserved=0