2011-09-17 50 views
1

弱引用的侦听器是否必须被删除才能发生垃圾收集?即使它们被弱引用,或者我们可以指望垃圾收集器恰当地处理它们,是不是很好的做法?AS3:弱引用必须被删除?

回答

1

您不必手动删除弱听者,以便对垃圾进行垃圾回收。不注销监听器会导致大部分内存泄漏,所以使用弱监听器可以显着提高程序的稳定性。

但是,为了防止在准备好之前删除弱听者,必须至少有一个强引用(或使用实例方法)。这通常意味着无论注册侦听器需要保留它,直到父类的引用已被删除。只要实例拥有组件最常见的侦听器,就会使侦听器持续下去。

有些情况下您必须管理监听器,那就是如果您计划不听父母的整个生活。可能的情况下,你想删除侦听器,然后在稍后添加它,不常见,但它发生。这就是弱听者对强大的参考听众没有任何优势。

垃圾收集器将删除微弱的侦听器,一旦强引用删除。弱听者使清理更简单。虽然人们很谨慎,但我相信你会听到,因为弱听者对于UI框架来说相当新颖。当GC被添加到主流语言时,大多数人也对此过于谨慎。

我们依靠GC来清理内存,这可以工作并且使代码更加稳定,而且现在人们不会调用那些草率的代码。弱听者没有什么不同。

0

我从来没有使用弱引用,但我非常小心地删除所有听众,当我不再需要它们时。我认为最好养成一种习惯,总是要去掉听众而不是使用弱引用。

事件侦听器中的弱引用选项主要是为了让您 不必手动删除事件侦听器。我个人倾向于 不使用它,因为我喜欢完全控制对象获取 标记为垃圾回收。

Clarifications regarding weak references in actionscript listeners

http://gingerbinger.com/2010/07/actionscript-3-0-events-the-myth-of-useweakreference/

0

这正是弱引用听众的点 - 你不严格需要将它们删除了垃圾收集发生。

但是,这个功能不应该被滥用作为一种手段来编写草率的代码。只有在自己无法正确清理的情况下,才应该依靠它们。如果你可以预测你什么时候会完成一个事件的监听,那么你应该使用一个强引用的事件监听器,并在完成后将其删除。

+0

使用强引用侦听器的好处是什么?我在某处读到最好总是使用弱引用:[link](http://gskinner.com/blog/archives/2006/07/as3_weakly_refe.html) – Abdulla