Форум 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=142519)

alekson 23.07.2010 12:55

Освобождение памяти
 
Код AS3:

package  
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.text.TextField;
        /**
        * ...
        * @author
        */

        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        this.draw();
                }
 
                /**
                * Отрисовка объектов
                */

                public function draw():void {
                        this._drawText();
                        this._drawButton();
                }
 
                /**
                * Рисует текстовое поле
                */

                private function _drawText():void {
                        var _text:TextField = new TextField();
                        _text.text = _text.name;
                        this.addChild(_text);
                }
 
                /**
                * Рисует кнопку
                */

                private function _drawButton():void {
                        var _button:Sprite = new Sprite();
                        _button.graphics.clear();
                        _button.graphics.beginFill(0xff0000, 1)
                        _button.graphics.drawRect(0, 0, 100, 20);
                        _button.addEventListener(MouseEvent.CLICK, this._onClick);
                        _button.x = 200;
                        _button.y = 200;
                        this.addChild(_button);
                }
 
                /**
                * Клик по кнопке - удаление объектов и их отрисовка заново
                * @param        event
                */

                private function _onClick(event:Event):void {
                        while (this.numChildren) {
                                this.getChildAt(0).removeEventListener(MouseEvent.CLICK, this._onClick);
                                this.removeChildAt(0);
                        }
 
                        this.draw();
                }
        }
}

Код рисует тектовое поле и спрайт с событием КЛИК по которому удаляет все объекты и рисует их заново.
Но требуемый объем памяти увеличивается. Почему? От событий отписался.

mikhailk 23.07.2010 13:22

Очевидно, GC не считает необходимым отвлекаться от пива и футбола по таким пустякам?

enepx 23.07.2010 13:36

Попробуйте присвоить всем объектам null и вызвать после этого System.gc().

mikhailk 23.07.2010 14:25

Кстати, да.
null присвоить надо.

Относительно System.gc() - в рантаймовой версии плеера все равно эта функция работать не будет.

gloomyBrain 23.07.2010 14:26

Цитата:

Но требуемый объем памяти увеличивается. Почему?
А Вы где память смотрели? FP занимает новую область памяти при создании объектов, не записывая в старую, пока не сработает gc. А gc, как известно, любит пиво и футбол, а работать не любит. Точнее говоря, он запускается, когда превышен некий лимит памяти, известный только ему

Цитата:

Кстати, да.
null присвоить надо.
Ну и в чем смысл присваивать null локальной переменной?

alekson 23.07.2010 14:37

память смотрю в Profiler/Memory у FD, с ней тогда ясно. Но закладка Live Objects Count показывает увеличение количества объектов TextField и Sprite с каждой перерисовкой - объясняется новой областью памяти?

trace(this.numChildren) всегда 2

Суть задачи перерисовать флешку с новыми входными данными. Подобную тему видел, но работает не очевидно.

enepx 23.07.2010 14:40

Попробуйте
Код AS3:

while (this.numChildren > 0)

вместо
Код AS3:

while (this.numChildren)


alekson 23.07.2010 14:44

это равносильно, цикл работает.

gloomyBrain 23.07.2010 14:44

Цитата:

Но закладка Live Objects Count показывает увеличение количества объектов TextField и Sprite с каждой перерисовкой - объясняется новой областью памяти?
Объект != ссылка на объект.
Когда Вы пишите new Object() - где-то выделяется кусочек памяти и в него записываются необходимые данные (описание нашего Object'а). И у нас не C++ чтобы иметь доступ к объектам. Мы можем иметь доступ только к ссылкам на объекты (переменным)

когда Вы пишите var o:Object = new Object() - Вы проделываете 2 операции :
1) создаете объект
2) создете ссылку на объект

когда вы пишите o = null - Вы просо говорите, что ссылка o уже не приведет нас ни к какому объекту.

Как только ни одной ссылки не осталось - объект доступен для сборки gc.
НО
Объект от этого не удаляется - он просто доступен для удаления. Когда придет время, gc его удалит.

По этому число объектов в профайлере растет

alekson 23.07.2010 14:47

ясно, спс, будем ждать когда придет время :)


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

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