一个不知道为什么的bug记录贴

昨晚临近下班,本想准时下班,然后屁颠屁颠的浪,结果同事给我反馈了个bug(ORZ)
手机上表现是:页面卡死,任何操作都不响应;模拟器表现是:一样的,日志打印了一堆:“the child to add must be instance of not”,这是个什么错误????
添加的节点是实例化预制体而来,就是这样

添加预制体也就是:parent.addChild(node)这样。
整个论坛只有一个帖子:为什么NodePool.put()会出现问题
???????
最后是这样:node.parent = parent解决了问题。
很懵逼,是正常的实例化预制体和添加节点的操作,不知错从何来。。。。

你调用代码之前打印一下node和parent,看看是不是哪个为空

都看了,都不为空:joy:
所以就很迷

只有不是 node 才会报这个错误,你看一下 child 具体是什么

这个child就是一个实例化的预制体,原本我是怀疑没有成功实例化,
昨晚通过日志确定了实例化成功

这个tipPrefab就是这个child,money_tip是预制体。

你应该要确定tipPrefab是cc.Node类型才行,先看你的money_tip是不是cc.Node

你试看看,看看这 三个 log 的结果是什么

console.log(child instanceof Node);
console.log(child instanceof Node && child.constructor === Node);
console.log(child instanceof Node && !(child instanceof cc.Scene));

我遇到过这种情况,无非就是你instantiate的时候,在其它地方去addchild了,那时候addchild 可能是没克隆完,我不知道引擎怎么判断的

加了之后,没看到有相关的输出

也不应该吧,我是在同一个方法里面instantiate和addchild的,在addchild之前还进行了数组合并等其他操作。实例化一个预制体需要很多时间吗?

在这里添加到数组

在这里addchild

moneytip是prefab,不是node,tipitem是实例化的moneytip,cc.instantiate(prefab)返回的是node啊

现在输入这 三个 log 就是要排查一下为什么返回的 node,但是 addChild 检测 isNode 是 false 的问题

console.log(tipPrefab instanceof Node);
console.log(tipPrefab instanceof Node && tipPrefab.constructor === Node);
console.log(tipPrefab instanceof Node && !(tipPrefab instanceof cc.Scene));

你什么都别管,想办法,输出上面这 三个 log 看看结果

大佬输出了,

还有这个Node应该是cc.Node吧?

拿奇怪了,都为 true 不应该会报错才对,如果你用 cc.Node.isNode(tipPrefab) 是 true 还是 false?

都是true

然后还是报 the child to add must be instance of not 这个错了?

是的,还是会报这个错。
但是我尝试了三种:
1.parent.addChild(tipPrefab)//会报错
2.tipPrefab.parent = parent;
3.if(tipPrefab.name!=“money_tip”)…

只有第一种,直接添加的时候报错,报错之后,短时间内编辑器卡死

反复测了多次,在真机上不是必现的bug,在模拟器上几乎必现。demo我试试能不能从项目中抽出来

按道理,如果三个 isNode 为 true 都话,就不应该会报错才对,你能不能给我一下简单的 demo,我这边测试看看?

大佬,我找到错误了:sweat_smile:
是我自己的代码原因:循环体越界了:sweat:(又是一个沙雕的问题)

:joy: 那你总结一下然后结帖吧,感谢