Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Объекты удалены, а профайлер показывает, что они еще висят в памяти?! :( (http://www.flasher.ru/forum/showthread.php?t=149847)

Killer_13 01.02.2011 19:26

Объекты удалены, а профайлер показывает, что они еще висят в памяти?! :(
 
Значит структура классов такова, из Controller в UI_Connection, из UI_Connection в UI_NewGame, но вопрос чуток в другом.

Смотрю на примере Комбобоксов. "из Controller в UI_Connection" - их нету на рабочей области, профайлер показывает, что их действительно нету в памяти, - все ок.

Потом "из UI_Connection в UI_NewGame" - появились на сцене 3 комбобокса, профайлер показывает, что они есть - все ок.

потом вот что делается в классе "UI_NewGame" - там кнопочка при нажатии на которую осуществляется коннект и передается управление классу Constructor который все удаляет и создает новый обьект.

НО! Все элементы интерфейса лежат в памяти. Почему?


Вот структура класса - там ничего сложного посмотрите пож
Код AS3:

package  
{
        import fl.controls.Button;
        import fl.controls.ComboBox;
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.net.NetConnection;
        import flash.events.NetStatusEvent;
        import flash.text.TextField;
        import flash.utils.Timer;
        import flash.events.TimerEvent;
        /**
        * ...
        * @author webdev
        */

        public class UI_NewGame extends MovieClip
        {
                private var anFrame:MaskFrame;
                private var cont:Sprite;
                private var btn_Create:Button;
                private var _uiConnection:UI_Connection;
                private var _controller:Controller;
                private var comboSpCount:ComboBox;
                private var comboSpStake:ComboBox;
                private var comboSpStartGeld:ComboBox;
                private var array:Array = new Array(3);
                private var netCon:NetConnection;
                private var _fmsConnection:FMS_Connect;
                private var urlName:String;
                private var appName:String;
 
                public function UI_NewGame(_uiConnection:UI_Connection, _controller:Controller, urlName:String, appName:String) {
                        trace("<--UI_NewGame::UI_NewGame-->");
                        this._controller = _controller;
                        this._uiConnection = _uiConnection;
                        this.urlName = urlName;
                        this.appName = appName;
                        setInterface();
                        }
 
                private function setInterface():void {
                        trace ("func___setInterface");
                        cont = new Sprite();
                        setFrame();
                        }
 
                private function setFrame():void {                       
                        trace("func___setFrame");
                        this.anFrame = new MaskFrame();
                        this.addChild(this.cont);
                        this.anFrame.x = 50;
                        this.anFrame.y = 200;
                        this.cont.addChild(this.anFrame);
 
                    var timer:Timer = new Timer(1400, 1);
                        timer.start();
                        timer.addEventListener(TimerEvent.TIMER, comboSpCnt);
                        }
 
                private function comboSpCnt(event:TimerEvent):void {
                        trace("func___comboSpCount");
 
                        comboSpCount = new ComboBox();
                        this.comboSpCount.x = 125;
                        this.comboSpCount.y = 217;
 
                        comboLabel(100, 200, "Waehle die Anzahl der Spieler");
                        for (var i:int = 2; i <9; i++) {
                                this.comboSpCount.addItem({label:i, data:i});                               
                        }
 
                        this.cont.addChild(this.comboSpCount);
 
                        var timer:Timer = new Timer (400, 1);
                        timer.start();
                        timer.addEventListener(TimerEvent.TIMER, comboSpSt);
                        (event.target as Timer).removeEventListener(TimerEvent.TIMER, comboSpCnt);
                        }
 
                private function comboSpSt(event:TimerEvent):void {
                        trace("func___comboSpStake");
 
                        this.comboSpStake = new ComboBox();
                        this.comboSpStake.x = 125;
                        this.comboSpStake.y = 352;
 
                        comboLabel(100, 335, "Waehle den maximalen Einsatz $");
                        for (var i:int = 1; i <=10; i++) {
                                this.comboSpStake.addItem({label:i, data:i});                               
                        }
 
                        this.cont.addChild(this.comboSpStake);
 
                        var timer:Timer = new Timer (400, 1);
                        timer.start();
                        timer.addEventListener(TimerEvent.TIMER, comboSpStGeld);
                        (event.target as Timer).removeEventListener(TimerEvent.TIMER, comboSpSt);
                        }
 
                private function comboSpStGeld(event:TimerEvent):void {
                        trace("func___comboSpStartGeld");
 
                        this.comboSpStartGeld = new ComboBox();
                        this.comboSpStartGeld.x = 125;
                        this.comboSpStartGeld.y = 482;
 
                        comboLabel(100, 465, "                  $ Max");
                        for (var i:int = 1; i <=5; i++) {
                                this.comboSpStartGeld.addItem({label:i, data:i});                               
                        }
 
                        this.cont.addChild(this.comboSpStartGeld);
 
                        var timer:Timer = new Timer (400, 1);
                        timer.start();
                        timer.addEventListener(TimerEvent.TIMER, btn_NewGame);
                        (event.target as Timer).removeEventListener(TimerEvent.TIMER, comboSpStGeld);
                        }
 
                private function btn_NewGame(event:TimerEvent):void {
                        trace ("func___btn_NewGame");
                        this.btn_Create = new Button();
                        this.btn_Create.label = "Create";
                        this.btn_Create.x = 125;
                        this.btn_Create.y = 620;
                        this.cont.addChild(this.btn_Create);
                        this.btn_Create.addEventListener(MouseEvent.CLICK, btn_Create_clk);
                        (event.target as Timer).removeEventListener(TimerEvent.TIMER, btn_NewGame);
                }
 
                private function comboLabel(_x:int, _y:int, str:String):void {
                        trace ("func___comboLabel");
                        var label:TextField = new TextField();
                        label.x = _x;
                        label.y = _y;
                        label.textColor = 0xFFFFFF;
                        label.width = 150;
                        label.text = str;
                        this.cont.addChild(label);
                }
 
                private function btn_Create_clk(event:MouseEvent):void {
                        trace ("func___btn_Create_clk");
                        this._fmsConnection = new FMS_Connect(urlName, appName);
                        this.netCon = this._fmsConnection.connecting();
                        this.netCon.addEventListener('netStatus', netStatusHandler);
                        }
 
                private function netStatusHandler(event:NetStatusEvent):void {
                        trace("func___netStatusHandler");
                        if (event.info.code == "NetConnection.Connect.Success")
                                setConnected();
                        else
                                _uiConnection.setError();
                }
 
                private function setConnected():void {
                        trace("func___setConnected1");
                        eventRemove();
                        this._controller.uiLogIn();
                }
 
                private function eventRemove():void {
                        trace("function___eventRemove");
                        this.netCon.removeEventListener('netStatus', netStatusHandler);
                        this.btn_Create.addEventListener(MouseEvent.CLICK, btn_Create_clk);
 
                }

Вот функции из контроллера.
Код AS3:

 
                public function uiLogIn():void {
                        trace("func___uiLogIn");
                        destructor();
                        _uigame = new UI_Game();
                        this.addChild(_uigame);
                        }
 
                private function destructor():void {
                        trace("func___destructorC");
 
                        while (numChildren)
                                removeChildAt(0);
                }

Огромное спасибо за подсказку, и вообще - я правильно передаю управление приложением обратно????

КорДум 01.02.2011 19:39

Очень много в коде лишнего. Почистите. Оставьте одно что-то, зачем все. Из-за этого так сразу и не видно - вы слушатели отписываете? А ссылки зануляете? А вообще, они так и будут висеть в памяти (если все сделано правильно), пока не придет товарищ GC.

Killer_13 01.02.2011 19:53

Ну я так.. для наглядности, в смысле лишнего, вы имеете введу, что тяжело разобраться по сути?
Если по сути, то последние функции, создание комбобоксов ни к чему... Нет ссылки не зануляю, вот.. уже подсказали, делаю. Может че и получится после зануления.

КорДум 01.02.2011 19:58

Да не тяжело, но это нужно не "пробежаться глазами", а именно "просмотреть", что отнимет больше времени. Да и большинству будет лень. От слушателей тоже отписывайтесь.

Killer_13 01.02.2011 20:03

да, вот доделал, обнулил, запустил в конце GC результат таков же, - висит в памяти. :(
Напомню, структура такова. из Controller в UI_Connection, из UI_Connection в UI_NewGame,
Из класса Controller

Код AS3:

private function destructor():void {
                trace("func___destructorC");
                _uiconnect.destroy();
                while (numChildren)
                        removeChildAt(0);
        }

из класса UI_Connection
Код AS3:

public function destroy():void {
        trace("func___UIDestroy");
        _uiNewGame.destroy();
}

из класса
UI_NewGame
Код AS3:

public function destroy():void {
                trace("function___destroy");
                this.netCon.removeEventListener('netStatus', netStatusHandler);
                this.btn_Create.addEventListener(MouseEvent.CLICK, btn_Create_clk);
                this.comboSpCount = null;
                this.comboSpStake = null;
                this.comboSpStartGeld = null;
                this.btn_Create = null;
                this.cont = null;
        }

Добавлено через 1 минуту
да, от слушателей тоже отписываюсь, специально не ставил никакие слушатели на эти комбобоксы, чтоб на них проверить.

КорДум 01.02.2011 20:09

А как же удалять из отображения кнопки и комбобоксы?

Killer_13 01.02.2011 20:12

Вот, цикл в конструкторе делает
Код AS3:

while (numChildren)
                        removeChildAt(0);

или он на самом деле не делает? :(

terbooter 01.02.2011 20:13

А gc, может и вовсе не прийти, если флешка мало памяти съела.

Killer_13 01.02.2011 20:19

все удаляет, только что проверял.
Хммм, ну как так тогда, элементы из сцены удалились, потом я их занулил, функция вызывается 100%! тоисть зануление делается, никакие события на комбобоксы не повешены. Я сейчас на другие элементы интерф не смотрю, так как главное чтоб один заработал, а остальные я сделаю.

КорДум 01.02.2011 20:23

Нужно удалить не контейнеры с кнопками, а именно сами кнопки, потом занулить на них ссылки, потом удалить контейнеры, занулить ссылки на них. Вот тогда НКВД г-н GC и заберет в места заключения все ненужное.


Часовой пояс GMT +4, время: 05:53.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.