版版我今天获得了一个bug反馈,说是执行了五个action的callback的动作,结果callback只调用了四次。
我想,这不可能呀。这可是大问题呀。于是我拿到了代码。一运行,发现,还真的是runAction了五次,只回调了四次。 
这到底是哪里出了问题呢?
现在附上代码,大家能看出来是什么问题不?:877:
HelloWorldLayer.js
ctor:function(){
...
for(var i=0; i<5;i++){
var textEffect = TextEffect.create(100,cc.p(500,400));
//var textEffect = this.create(100,cc.p(500,400));
if(textEffect)
this.addChild(textEffect,1000);
}
...
}
TextEffect .js
var TextEffect = {
fontList : ],
create : function(num, pos) {
if(!num)
return;
var str = "";
if(num < 0)
str = num;
else
str = "+"+num;
var ret = new cc.LabelBMFont(str,"res/fonts/bitmapFontTest.fnt");
ret.x = pos.x+45;
ret.y = pos.y;
this.fontList.push(ret);
cc.log("添加一个飘血");
ret.runAction(cc.sequence(cc.moveBy(1, cc.p(0, 30) ), cc.callFunc(this.destroy, this)));
return ret;
},
destroy : function(){
if(this.fontList.length){
cc.log("删除一个飘血");
this.fontList.removeFromParent(true);
this.fontList.shift();
}
},
clear : function(){
this.fontList = ];
}
};
以上是测试代码,
出现的情况就是
先打印了五次 添加一个飘血
而后只打印了四次 删除一个飘血。
大家看出代码有什么问题了么?:886:
下面揭晓答案。
是的,没错,问题的答案就是 标题说的。action的执行顺序问题。
this.fontList将五次创建的LabelBMFont存储起来了。但是回调的时候,并不一定是按顺序回调回来的,也就是,这段代码
this.fontList.removeFromParent(true);
删除了不该删除的BMFont对象。
最后修改如下
destroy : function(sender){
if(this.fontList.length){
cc.log("删除一个飘血");
sender.removeFromParent(true);
//this.fontList.removeFromParent(true);
//this.fontList.shift();
}
},
就正常了。你猜到了么?:870:

学习学习
啥原因?