ActionScript Garbage Collect problem

eralha

Power Member
Boas pessoal, estou com um problema no garbage collecting de uma aplicação que fiz, basicamente o que esta aplicação faz é carregar imagens em slid show, o que sucede e que o uso de memória nao para de subir levando mesmo ao esgotamento de recursos, posto em baixo o exemplo do codigo que tenho resumido, apenas tenho o loader e mesmo fazendo o unload do recurso, a memória nao fica livre.

Código:
package ui{
    
    import flash.display.*;
    import flash.events.*;
    import flash.net.URLRequest;
    import flash.text.TextField;
    import ui.XmlPhraser;
    import ui.squareTransition;
    import caurina.transitions.Tweener;
    import flash.utils.Timer;
    import flash.events.TimerEvent;

    
    public class homePageEngine extends MovieClip{
        
        private var images:Array = new Array();
        private var imageIndex:Number = 0;
        private var imageLoader:Loader;
        private var xmlDataReader:XmlPhraser = new XmlPhraser();
        private var imageReference:MovieClip;
        private var transition:squareTransition;
        private var stagesArray:Array = new Array();
        private var Timmer:Timer = new Timer(6000);
        private var temporaryData:*;
        private var image:Bitmap;
        private var container:MovieClip;
        private var imageContainer:MovieClip;
        public static var DATA_LOAD_COMPLETE:String = "dataLoad";
        
        public function homePageEngine():void{
            
            Timmer.addEventListener("timer", timerHandler);
            xmlDataReader.addEventListener(DATA_LOAD_COMPLETE, startAPI);
            xmlDataReader.xmlFile = "galeria.xml";
            xmlDataReader.loadData();
            
        }
        
        private function startAPI(e:Event=null):void{
            if(images.length == 0){images = xmlDataReader.imageList;}
            if(imageLoader!=null){
                try {
                imageLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, imageLoadComplete);
                imageLoader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, imageIoErrorHandler);
                imageLoader.close()
                imageLoader = null
                    } catch (e:Error) {
                        trace(e);
                    }
            }
            imageLoader = new Loader();
            imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, imageLoadComplete);
            imageLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, imageIoErrorHandler);
            imageLoader.load(new URLRequest(images[imageIndex]));
        }
        
        private function imageLoadComplete(e:Event):void{
            imageIndex ++;
            if(imageIndex >= images.length){imageIndex = 0;}
            if(image != null){
                image = null;
                container = null;
                imageContainer = null;
            }
            st.text = String(imageIndex);
            imageLoader.unload();
            Timmer.start();
        }
        
        private function imageIoErrorHandler(e:Event):void{
            
        }
        
        public function timerHandler(event:TimerEvent):void {
            //trace("timerHandler: " + event);
            Timmer.stop();
            try{
                
                startAPI();
            }catch(e:Error){
                trace(e.toString());
            }
        }

    }
}
 
Simples, o codigo que postei nao tem problema nenhum, levei foi algum tempo a perceber o funcionamento do GC do flash player. o que via era a memória a incrementar o que me levava a penssar que nao estava a ser feito o GC correctamente, com um pouco de paciencia, reparei que quando atingia um determindao valor de utilização de memória o GC actuava limpando a mem até aos valores iniciais. o GC do flash apenas elemina objectos que tenham 0 referencias associadas.
 
podes com: System.gc(); (o que so funciona com debug mode) ou com um pequeno truque dito por grant skiner....que nao acho que seja necessário.
 
Back
Topo