日期:2013-07-04  浏览次数:20561 次

在2010年1月24日在上海举办的Flash开发者交流会中,我曾经在会场上讲了Tween,URLLoader等类,会由于使用弱援用侦听而导致错误,是什么缘由出错呢?下面讲的就是错误的本源,也算是对于我那天所讲,做一个全面的补充。(另外:感激李正民同学让我了解了"援用计数"这个专业词)

首先我们来看一个Flash和一段代码:
点击上方的黑色小按钮,点一次发现效果还不错,那么你在开始有间隔的狂点这个小按钮,点的次数多了,时间长了,BUG就出现了,会发现有些动画卡住了,显示对象有时候不会运动到四周。
/web/UploadPic/2011-4/20114225175770.swf

下面的代码就是这个Flash的源码,看过了BUG后,接下来谁能在代码中发现这个BUG是如何引发的呢?

package
{
  import fl.transitions.Tween;
  import fl.transitions.easing.Bounce;
  
  import flash.display.Bitmap;
  import flash.display.Sprite;
  import flash.events.MouseEvent;

  public class TestShow extends Sprite
  {
    [Embed (source="1.jpg")]
    private var Pic:Class;
    
    private var btn:Sprite;
    private var centerX:int;
    private var centerY:int;
    
    public function TestShow()
    {
      init();
    }
    
    //初始化
    private function init():void{
      centerX = stage.stageWidth / 2;
      centerY = stage.stageHeight / 2;
      
      btn = new Sprite;
      btn.graphics.beginFill(0,0.5);
      btn.graphics.drawRect(centerX - 10,0,20,10);
      btn.graphics.endFill();
      btn.buttonMode = true;
      stage.addChild(btn);
      
      btn.addEventListener(MouseEvent.CLICK,clickHandle);
    }
    
    //点击创建
    private function clickHandle(e:MouseEvent):void{
      var width:int = stage.stageWidth;
      var height:int = stage.stageHeight;
      for(var i:int = 0; i <= 8; i ++){
        var x:int = centerX,y:int = centerY;
        if(i == 4) continue;
        if(i % 3 == 0) x = 0;
        else if(i % 3 == 2) x = width;
        if(i < 3) y = 0;
        else if(i > 5) y = height;
        create(x,y);
      }
    }
    
    //创建一个
    private function create(x:int,y:int):void{
      var spr:Sprite = new Sprite;
      var pic:Bitmap = new Pic;
      pic.x = - pic.width / 2;
      pic.y = - pic.height / 2;
      spr.addChild(pic);
      spr.x = centerX;
      spr.y = centerY;
      setAnimation(spr,x,y);
      addChild(spr);
    }
    
    //创建动画
    private function se