as3里提供弱引用的地方一共有两个,一个是EventDispatcher的addEventListener方法,一个是Dictionary
1、无论是否使用弱引用或者强引用,只要事件对象没有再被其他对象引用,并且垃圾回收周期到达。那么无论是否使用了removeEventListener移除他的事件,这些事件都不会发生了。因为已经没有了事件发送者了。
举例:
var a:Sprite=new Sprite();
var b:Sprite=new Sprite();
b.graphics.beginFill(0x000000);
b.graphics.drawRect(100,100,100,20);
b.graphics.endFill();
addChild(b);
b.addEventListener(MouseEvent.CLICK,on
a.addEventListener(Event.ENTER_FRAME,tracea);
function tracea(evt:Event)
{
trace("a");
}
function on
{
a=null;
System.gc();//立即触发垃圾回收。
}
建议:事实上在我们真正的应用中无法使用debug版本中的gc()方法,所以最好还是应该养成移除侦听器的习惯。
2、弱引用是指侦听器,而不是事件发送者。第一点已经说过了,事件发送者一旦不存在了也就无所谓弱引用或者强引用了。弱引用引用的是侦听器(即function).大部分情况下我们的侦听器是事件发送者自己的一个方法。
比如:
class A
{
function A()
{
addEventListener(MouseEvent.CLICK,on
}
function on
{
//点击需要执行的代码
}
}
这种情况下是没有弱引用或者强引用的区别的。
但是如果你的事件发生者是A,而给A注册的侦听器是由B提供的方法。那么这个时候你就需要注意了。
3、强引用和弱引用的区别
强引用下:B实例即使移除,但是由于他的方法注册给了A作为侦听器,所以B这个实例一直都会存在永远不会被回收。
弱引用下:B实例移除后,即使A还需要他的方法作为侦听器,但是回收周期移到。A就无法在使用B的这个方法了。
用一个漫画形象说明一下强引用和弱引用:
