В Интернете есть некоторые ссылки на то, что таймеры запуска никогда не собираются, например, :
Просто чтобы прояснить: даже если у вас нет ссылок на таймер,пока таймер работает, он не будет собирать мусор (представьте, что среда выполнения хранит ссылку на запущенные таймеры).
от Арно Гурдола из Adobe AIR Team
но мне не удалось найти авторитетный источник.
Вероятно, лучше не полагаться на это специальное поведение, а вместо этого сделать timer
переменной уровня класса.
Ответы, указывающие на то, что слушатели событий удерживают таймер от сбора мусора, неверны.Ссылка от таймера до функции слушателя (onTimerComplete
), поэтому, если таймер достижим, функция слушателя не будет собирать мусор, но не наоборот.Это легко проверить:
<?xml version="1.0" encoding="utf-8"?>
<s:Application
xmlns:s="library://ns.adobe.com/flex/spark"
creationComplete="application1_creationCompleteHandler(event)">
<fx:Script>
<![CDATA[
private var _gcTimer:Timer;
protected function application1_creationCompleteHandler(event:FlexEvent):void {
var timer:Timer = new Timer(30, 4);
timer.addEventListener(TimerEvent.TIMER, onTimer, false, 0, true);
var sprite:Sprite = new Sprite();
sprite.addEventListener(Event.ENTER_FRAME, onSprite, false, 0, true);
_gcTimer = new Timer(59, 1);
_gcTimer.addEventListener(TimerEvent.TIMER, garbageCollect);
timer.start();
_gcTimer.start();
}
private function onTimer(event:TimerEvent):void {
trace("timer");
}
private function onSprite(event:Event):void {
trace("sprite");
}
]]>
</fx:Script>
</s:Application>
Вывод:
спрайт
таймер
спрайт
таймер
сбор мусора
таймер
таймер