![]() |
|
||||||||||
|
|||||
|
Регистрация: Jun 2009
Сообщений: 56
|
Объясните, пжлст, почему анонимная функция в приведённом примере не подвергается сборке мусора.
FP дебажный. Просто изучаю, в производстве не использую ![]() 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(); } } } } Цитата:
|
|
|||||
|
Регистрация: Sep 2010
Адрес: Ростов-на-Дону
Сообщений: 369
|
Анонимная ф-ция здесь только обработчик добавления на сцену, которая вызывается один раз и в которой таймеру вешается обработчик (не анонимный) и запускается таймер. Где связь между вашим трейсом и тем утверждением, что gc не собрал анонимную ф-цию?
|
|
|||||
|
Регистрация: Jun 2009
Сообщений: 56
|
Объект timer - локальная переменная для анонимного обработчика. Если существует он, то существует и функция. Я не прав?
|
|
|||||
|
В корне не правы.
Все переменные создаются в куче, на стеке ничего не создаётся. Вы запросили у среды таймер (через new) а потом результат, ссылку на него, положили к себе в локальную переменную. Когда выполнение функции завершилось локальные переменные были уничтожены. Т.к. вы отписались, а вы вроде отписались, то ссылок ни на таймер ни на анонимную функцию не осталось. И функция скорее всего была уничтожена. Но тикающий таймер тикает сам по себе и не будет удалён пока тикает. А вообще анонимные функции это зло. Используйте нормальные.
__________________
:) |
|
|||||
|
Регистрация: Jun 2009
Сообщений: 56
|
Спасибо за разъяснения
![]() Не знал, что Timer такой особенный. В таком случае, подскажите, как можно проверить собралась ли анонимная функция коллектором? |
|
|||||
|
Modus ponens
|
Ну, для таких вещей вобщем-то и придумали профилировщик. Для уверенности - создайте несколько тысяч, и смотрите как будут себя вести, чтобы случайно не перепутать с какими-нибудь другими функциями.
__________________
Hell is the possibility of sanity |
![]() |
![]() |
Часовой пояс GMT +4, время: 14:18. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|