当前位置: 代码迷 >> Web前端 >> AS3 事件中的弱摘引
  详细解决方案

AS3 事件中的弱摘引

热度:373   发布时间:2012-11-23 22:54:33.0
AS3 事件中的弱引用

文章来之:http://hi.baidu.com/mr%5Fziqiang/blog/item/ff263938e641cb2cb8998fcd.html

?

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的这个方法了。

?

?

用一个漫画形象说明一下强引用和弱引用:

?

  相关解决方案