使用弱引用添加的事件监听器在ActionScript中存在问题

3

我的问题基本上是这样的。有一个扩展EventDispatcher类的实例。当我像这样向对象添加事件监听器时,一切都很顺利:

myObject.addEventListener('eventName', someFunction, false, 0, false);

当使用弱引用添加事件监听器时,会发生一些变化:

myObject.addEventListener('eventName', someFunction, false, 0, true);

现在即使像以前一样执行包含dispatchEvent('eventName')的行,someFunction也没有被调用(并且myObject也有外部引用)。

我正在开发的应用程序非常复杂,所以很遗憾,我无法发布确切的代码。

2个回答

5
你对GC的工作方式有所误解。使用弱引用不会固定myObject。它可能(可能不一定)防止声明处理程序的范围被收集(只要myObject本身还活着)。因此,回调本身可能会被收集,导致它不被执行。根据您的描述,似乎情况就是这样。
因此,您的目标是避免声明someFunction的范围被收集。一种方法可能是实际使用硬引用(如果您问我,弱引用是一个坏主意)。可能还有其他方法,但我不知道您的应用程序结构,因此无法多说。
从GC的角度来看,事件处理与一般情况没有区别。当您添加侦听器时,您正在传递对分派程序的引用(该引用是声明侦听器的范围)。分派程序存储此引用,以便在必要时执行回调。这真的与以下内容没有太大区别:
myObject.keepThisReference = someFunction;

现在,myObject 引用了 someFunction。只要 myObject 活着,someFunction 也会活着(除非你将 someFunction 设置为弱引用)。
所以,回答你评论中的问题(一个对象没有被任何其他地方引用,但有事件监听器附加),考虑到这种情况:
myObject.addEventListener('someEvent',someFunction);

如果myObject没有其他引用并且超出了作用域,它是可以被收集的。

你说得对。我原本认为事件处理程序会保留对象的引用(无论是弱引用还是强引用),而不是监听器的引用。现在我有另一个问题。当某个对象没有任何引用,但它有一个事件监听器时,这个对象会被回收吗? - Danylo Mysak

0
如果没有其他链接到myObject的话,那么当你所在的函数超出作用域时,它将被收集。要么更改代码使其不是弱监听器,要么确保代码中有对myObject的其他引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接