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

 

 

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值