闪存垃圾收集器和处理事件

时间:2012-02-20 09:55:32

标签: flash actionscript-3 garbage-collection

看看以下代码

var a = new View();
a = null;
....
class View {
    private var clip: MovieCLip

    public function View() {
        clip.addEventListener(...)
    }
}
a之后,

a = null在内存中吗? addEventListener是否会引起强烈推荐?

3 个答案:

答案 0 :(得分:2)

默认情况下,addEventListener会添加强引用。 addEventListener的最后一个参数是useWeakReference。您可以使用true为此参数指定弱引用。

答案 1 :(得分:2)

在描述您的示例时,附加事件侦听器的对象不会被垃圾回收。即使设置为null也无济于事。

要获取此对象goto gc(),您可以使用以下方法之一:

  1. 将useWeakReference

    clip.addEventListener(EVENT.name,listenerMethod,false,0,true);

  2. 取消订阅听众。

  3. 处理程序方法

    function handlerMethod(ev:Event):void
    {
      clip.removeEventListener(EVENT.name,listenerMethod);
    }
    

答案 2 :(得分:1)

由于对clip的所有引用均在a范围内,因此GC会选取这两个对象并干净地删除它们。

我采用了你的例子并使用了一个ENTER_FRAME监听器来创建新的View,就像你做的那样:

Graph object not added to the stage

但是,如果剪辑被添加到舞台上,那么它将继续存在,并且a也不会被删除:

Graph for objects added to the stage

您可以使用useWeakReference的{​​{1}}参数来防止这种情况发生。