前几天遇到了一个十分诡异的bug,分享出来大家看看,代码是这个样子的:
1 | local a = display.newNode() |
这个程序正常的结果应该是10
,但实际却是0
.这个问题十分诡异,如果是-1
的话还说的过去,但0
是个什么情况嘛?
仔细想想,大家应该很快能把异常的位置定位到b:addTo(a)
这行中,让我们看下下addTo
函数的实现:
1 | function CCNodeExtend:addTo(target, zorder, tag) |
不难看出,当你调用addTo函数不传入zorder, tag
时会自动帮你设置为0
!
知道了原因,解决起来十分容易:
- 使用
addChild
函数代替addTo
- 在
addTo
调用时传入tag
- 在
addTo
调用之后调用setTag
函数
是不是很简单呢? 这主要是测试代码比较简单的原因,我当时的 setTag 和 addTo 都没有在一个文件里!!!找死我了!!
平复下心情,我们来想想造成这个bug的原因:
首先, shortcodes
系列的函数设计的初衷可能是为了连续的调用函数,不建议分开单独使用! 但是我觉得最主要的原因是addTo函数的实现是不够健壮的,如果参考C++ addChild函数的话应该是这样子:
1 | function CCNodeExtend:addTo(target, zorder, tag) |
以上