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

rs7 05.09.2012 10:32

Анонимная функция и сборщик мусора
 
Объясните, пжлст, почему анонимная функция в приведённом примере не подвергается сборке мусора.
FP дебажный.

Просто изучаю, в производстве не использую :)

Код AS3:

package {
 
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.TimerEvent;
        import flash.system.System;
        import flash.utils.Timer;
 
        public class Main extends Sprite {
 
                public function Main():void {
 
                        addEventListener(Event.ADDED_TO_STAGE, function (event:Event):void {
                                trace("addedToStage");
 
                                var timer:Timer = new Timer(500);
                                timer.addEventListener(TimerEvent.TIMER, tick, false, 0, true);
                                timer.start();
 
                                event.currentTarget.removeEventListener(event.type, arguments.callee);
                        });
                }
 
                private var i:int = 1;
 
                private function tick(event:Event = null):void {
                        trace("tick", i);
 
                        if (!(i++%5)) {
                                trace("gc");
 
                                System.gc();
                        }
                }
 
        }
 
}

Цитата:

addedToStage
tick 1
tick 2
tick 3
tick 4
tick 5
gc
tick 6
tick 7
tick 8
tick 9
tick 10
gc
tick 11
tick 12
tick 13
tick 14

//и так далее

Silicium 05.09.2012 10:45

Анонимная ф-ция здесь только обработчик добавления на сцену, которая вызывается один раз и в которой таймеру вешается обработчик (не анонимный) и запускается таймер. Где связь между вашим трейсом и тем утверждением, что gc не собрал анонимную ф-цию?

rs7 05.09.2012 10:50

Объект timer - локальная переменная для анонимного обработчика. Если существует он, то существует и функция. Я не прав?

Aquahawk 05.09.2012 11:15

В корне не правы.
Все переменные создаются в куче, на стеке ничего не создаётся. Вы запросили у среды таймер (через new) а потом результат, ссылку на него, положили к себе в локальную переменную. Когда выполнение функции завершилось локальные переменные были уничтожены. Т.к. вы отписались, а вы вроде отписались, то ссылок ни на таймер ни на анонимную функцию не осталось. И функция скорее всего была уничтожена. Но тикающий таймер тикает сам по себе и не будет удалён пока тикает.
А вообще анонимные функции это зло. Используйте нормальные.

wvxvw 05.09.2012 11:22

Таймер вообще всегда надо явно останавливать. Иначе его никто не удалит.

rs7 05.09.2012 12:14

Спасибо за разъяснения :)
Не знал, что Timer такой особенный.

В таком случае, подскажите, как можно проверить собралась ли анонимная функция коллектором?

wvxvw 05.09.2012 13:57

Ну, для таких вещей вобщем-то и придумали профилировщик. Для уверенности - создайте несколько тысяч, и смотрите как будут себя вести, чтобы случайно не перепутать с какими-нибудь другими функциями.


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

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