Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 对actionscript 3中的垃圾收集和弱引用事件感到困惑_Actionscript 3_Garbage Collection_Weak References - Fatal编程技术网

Actionscript 3 对actionscript 3中的垃圾收集和弱引用事件感到困惑

Actionscript 3 对actionscript 3中的垃圾收集和弱引用事件感到困惑,actionscript-3,garbage-collection,weak-references,Actionscript 3,Garbage Collection,Weak References,我引用了一个对象。此对象具有弱引用的计时器事件。例如: timer.addEventListener(TimerEvent.TIMER, timerHandler, false, 0, true); 现在我删除此引用(test是包含该引用的变量): 然而,timerHandler一直被解雇。这是不可能的,所以我的代码中一定有某种错误,没有任何其他可能性吗 或者这真的不应该阻止计时器功能一直运行吗?垃圾收集器没有持续运行,所以很可能它还没有运行。当它最终执行时,您的处理程序应该停止被调用。如果没

我引用了一个对象。此对象具有弱引用的计时器事件。例如:

timer.addEventListener(TimerEvent.TIMER, timerHandler, false, 0, true);
现在我删除此引用(test是包含该引用的变量):

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


或者这真的不应该阻止计时器功能一直运行吗?

垃圾收集器没有持续运行,所以很可能它还没有运行。当它最终执行时,您的处理程序应该停止被调用。如果没有,可能还有另一个参考

当我运行下面的示例时,我看到无限期跟踪
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');
      };
    }
  }
}

一般来说,程序的正确运行不应该依赖垃圾收集器。

谢谢。您建议使用System.gc()方法手动调用垃圾收集器吗?嘿,Tom,不,您不应该这样做(它实际上是一个只支持调试播放器的功能)。由于性能原因,垃圾收集器每隔一段时间运行一次(这是一个昂贵的过程)。如果您处理完时间事件,您应该通过停止计时器并删除事件侦听器来正确地清理它们。对于在此登录的任何人,在弱引用上。@Russ正确的链接似乎是:
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');
      };
    }
  }
}