1

我有一个对象的引用。这个对象有一个带有弱引用的定时器事件。例子:

timer.addEventListener(TimerEvent.TIMER, timerHandler, false, 0, true);

现在我删除了这个引用(test 是包含引用的变量):

test = null;

然而, timerHandler 一直被解雇。这是不可能的,所以我的代码中一定有某种错误,没有任何其他可能性吗?

或者这确实不应该阻止计时器功能一直运行?

4

1 回答 1

3

垃圾收集器不会持续运行,因此很可能它还没有运行。当它最终完成时,您的处理程序应该停止被调用。如果没有,可能还有其他参考。

当我运行下面的示例时,我看到timer无限期地跟踪,即使handler已设置为 null 并且EventDispatcher具有弱引用。但是,如果我通过取消注释该行(使用调试播放器)来强制垃圾收集器运行,System.gc()则永远不会调用处理程序。

package {
  import flash.display.Sprite;
  import flash.events.Event;
  import flash.events.TimerEvent;
  import flash.system.System;
  import flash.utils.Timer;

  public class TimerTest extends Sprite {
    private var timer:Timer;
    public function TimerTest() {
      var handler:Function = createHandler();
      timer = new Timer(1000);
      timer.addEventListener(TimerEvent.TIMER, handler, false, 0, true);
      timer.start();
      handler = null;
      //System.gc();
    }

    private function createHandler():Function {
      return function(e:Event):void {
        trace('timer');
      };
    }
  }
}

通常,您不应依赖垃圾收集器来正确运行程序。

于 2009-08-15T00:39:01.113 回答