AS3 事件中的弱引用

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的這個方法了。

用一個漫畫形象說明一下強引用和弱引用:

AS3 事件中的弱引用 - cruelchen - 請重啓您的計算........
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章