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,onclick);
a.addEventListener(Event.ENTER_FRAME,tracea);
function tracea(evt:Event)
{
trace("a");
}
function onclick(evt:MouseEvent)
{
a=null;
System.gc();//立即觸發垃圾回收。
}
建議:事實上在我們真正的應用中無法使用debug版本中的gc()方法,所以最好還是應該養成移除偵聽器的習慣。
2、弱引用是指偵聽器,而不是事件發送者。第一點已經說過了,事件發送者一旦不存在了也就無所謂弱引用或者強引用了。弱引用引用的是偵聽器(即function).大部分情況下我們的偵聽器是事件發送者自己的一個方法。
比如:
class A
{
function A()
{
addEventListener(MouseEvent.CLICK,onClickHandler);
}
function onClickHandler(e:MouseEvent)
{
//點擊需要執行的代碼
}
}
這種情況下是沒有弱引用或者強引用的區別的。
但是如果你的事件發生者是A,而給A註冊的偵聽器是由B提供的方法。那麼這個時候你就需要注意了。
3、強引用和弱引用的區別
強引用下:B實例即使移除,但是由於他的方法註冊給了A作爲偵聽器,所以B這個實例一直都會存在永遠不會被回收。
弱引用下:B實例移除後,即使A還需要他的方法作爲偵聽器,但是回收週期移到。A就無法在使用B的這個方法了。
用一個漫畫形象說明一下強引用和弱引用: