gpt4 book ai didi

actionscript-3 - ActionScript 中的弱引用添加的事件监听器出现问题

转载 作者:行者123 更新时间:2023-12-04 06:54:04 28 4
gpt4 key购买 nike

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

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

但是当通过弱引用添加事件监听器时,情况会发生变化:

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

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

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

最佳答案

我认为您误解了 GC 的工作原理。使用弱引用不会固定 myObject。它可以(可能,不一定)阻止声明处理程序的范围被收集(只要 myObject 本身是事件的)。因此,回调本身可以被收集,导致它不被执行。根据您的描述,这里似乎就是这种情况。

因此您的目标是避免收集声明 someFunction 的范围。一种方法可能是实际使用硬引用(如果你问我,不管怎样,弱引用是个坏主意)。可能还有其他人,但我不知道你的应用程序是如何构建的,所以我不能说太多。

编辑以解决评论。

在 GC 方面,事件处理与一般情况没有什么不同。添加监听器时,您将引用传递给调度程序(引用是声明监听器的范围)。 dispatches 存储此引用,以便它可以在需要时执行回调。这和这真的没什么不同:

myObject.keepThisReference = someFunction;

现在,myObejct 引用了 someFunction。因此,只要 myObject 还活着,someFunction 也会活着(除非您将 someFunction 设置为弱引用)。

因此,要回答您评论中的问题(一个对象未​​在其他任何地方引用,但附加了一个事件监听器),在这种情况下:

myObject.addEventListener('someEvent',someFunction);

如果 myObject 没有任何其他引用并且超出范围,则它可收集的。

关于actionscript-3 - ActionScript 中的弱引用添加的事件监听器出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7229650/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com