У меня была похожая ситуация, и это сводило меня с ума на пару часов. Ответы, которые я нашел в сети, тоже не помогли, но в конце концов я обнаружил, что вызов System.gc()
помогает.
Я использую слушатель слабой ссылки ENTER_FRAME, чтобы проверить, удаляется ли экземпляр GC. Если GC очищает объект, ENTER_FRAME должен прекратить работу.
Вот пример:
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.system.System;
import flash.utils.getTimer;
import flash.utils.setTimeout;
public class GCTest {
private var _sprite:Sprite;
public function GCTest():void {
this._sprite = new Sprite();
this._sprite.addEventListener(Event.ENTER_FRAME, this.test, false, 0, true);
setTimeout(this.destroy, 1000); //TEST doesn't work
}
private function test(event:Event):void {
trace("_" + getTimer()); //still in mem
}
public function destroy():void {
trace("DESTROY")
System.gc();
}
}}
Когда вы комментируете System.gc();
, тестовый метод продолжает вызываться даже после вызова метода destroy (поэтому время ожидания истекло). Вероятно, это потому, что памяти все еще достаточно, поэтому GC сам по себе не срабатывает.
Когда вы закомментируете setTimeout, тестовый метод вообще не будет вызываться, то есть определенно проблема в setTimeout.
Вызов System.gc();
остановит отправку ENTER_FRAME.
Я также провел несколько тестов с clearTimeout, setInterval и clearInterval, но это не повлияло на GC.
Надеюсь, это поможет некоторым из вас с такими же или похожими проблемами.