2012-02-20 15 views
0

看看下面的代码闪光灯垃圾收集和处理事件

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

    public function View() { 
     clip.addEventListener(...) 
    } 
} 

a在内存a = null后? addEventListener是否增加了强烈的引用?

+0

最好的,你所能做的就是删除所有事件侦听器。您可以使用一些现有的库来记住添加的监听器,或者在您的代码中执行此操作。 – turbosqel 2012-02-20 14:24:11

回答

1

由于所有clip的引用是内a,GC会拿起对象和干净地删除它们。

我已经采取了你的榜样,并使用ENTER_FRAME监听器在你做了同样的方式来创建新的View S:

Graph object not added to the stage

但是,如果剪辑添加到舞台,然后它会继续存在,并a也不会被删除:

Graph for objects added to the stage

您可以使用的useWeakReference参数0以防止这种情况发生。

+0

谢谢!我可能想知道你是怎么制作这些地块的? – Eugeny89 2012-02-20 17:18:00

+0

我使用FDT发展,它有一个非常有用的探查:) http://fdt.powerflasher.com/ – weltraumpirat 2012-02-20 17:50:36

2

默认情况下addEventListener增添了有力的参考。 addEventListener的最后一个参数是useWeakReference。您可以使用此参数的true来指定弱引用。

+0

这意味着一个vil不会被删除?谢谢 – Eugeny89 2012-02-20 10:17:33

2

描述您例如,在事件侦听器所连接的对象将不会被垃圾收集。即使设置null也无济于事。

得到这个对象转到GC(),您可以使用下列方法之一:

  1. 将useWeakReference

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

  2. 退订听众。

在处理方法

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

这实际上并非如此 - 因为除了a之外不存在对剪辑的引用,两者都将被GC拾取。 – weltraumpirat 2012-02-20 10:36:50

+0

为什么你想要一个剪辑退出舞台? – 2012-02-20 10:38:50

+0

它可能已被添加或删除到其他地方 - 我们不知道。我们只知道代码中的内容。 – weltraumpirat 2012-02-20 10:41:09