删除对象的所有引用会删除该对象内的事件侦听器?

时间:2009-06-30 14:56:01

标签: actionscript-3 event-handling garbage-collection

当我有一个对象时,删除对它的所有引用就足以为垃圾收集器签名了,至少我听到的就是这样。例如:

removeChild(object);
object = null;

我仍然有点困惑,因为这是否意味着在这个对象的实例中制作的事件监听器也会被自动删除?或者我需要做什么?

2 个答案:

答案 0 :(得分:7)

啊,你已经在托管代码中找到了内存管理的关键:如果你是一个对象,并且你有另一个对象的引用(即使它只是以事件监听器的形式),那么你至少是在GC期间不会从内存中删除对象的一个​​原因。

对于显示对象,并且根据我的经验,您几乎想要订阅事件调度程序但负责该调度程序保留在内存中,您应该使用弱参考选项:

myPublisher.addEventListener("myEvent", myHandlerFunction, false, 0, true);

在我遇到的几乎所有情况中,“假,0,真”(其中true表示“使用弱引用”,并且松散地翻译为“添加此侦听器,但不要使其成为调度程序不要从内存中清除“ - 请参阅文档以获取更多信息”是添加事件侦听器的正确方法。很少有教科书或文档片段出于某种原因说明这种方法,这是不幸的,因为它可以提供更直观的内存管理体验。我建议使用它作为规则而不是例外。

希望它有所帮助!

答案 1 :(得分:0)

一个重要的事情你应该考虑的是,如果一个对象O有事件处理程序,即作为事件处理程序添加到E的方法,那么这也算作一个引用...除非你用弱引用添加处理程序......

如果你有一个闭包,其外部作用域包含对O的引用,那么这是一个引用...

你不需要删除对O的所有引用,也不需要为GC注册...... GC也会删除循环引用...它会删除内存中的所有“孤岛”,如果你将...仅“ peninsulae“连接内置对象的”大陆“,即定时器,显示列表,I / O层等,不会被收集......

another post of mine的最后一段稍微处理了这个话题......

所以是的,基本上,如果O获得GCd,那么任何事件处理程序都会获得GCd,除非有另一个对它们的引用......等等。

希望有帮助......:)

格尔茨

back2dos