日期:2013-07-04 浏览次数:20608 次
在2010年1月24日在上海举办的Flash开发者交流会中,我曾经在会场上讲了Tween,URLLoader等类,会由于使用弱援用侦听而导致错误,是什么缘由出错呢?下面讲的就是错误的本源,也算是对于我那天所讲,做一个全面的补充。(另外:感激李正民同学让我了解了"援用计数"这个专业词)
首先我们来看一个Flash和一段代码:
点击上方的黑色小按钮,点一次发现效果还不错,那么你在开始有间隔的狂点这个小按钮,点的次数多了,时间长了,BUG就出现了,会发现有些动画卡住了,显示对象有时候不会运动到四周。
/web/UploadPic/2011-4/20114225175770.swf
下面的代码就是这个Flash的源码,看过了BUG后,接下来谁能在代码中发现这个BUG是如何引发的呢?
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