在测试项目过程中,二次打开某一个界面,碰到了这个报错。问题复现过程:
- 打开A界面(父节点所在界面),在A界面中点击按钮打开子界面B添加到父节点中
- 操作完成后关闭B界面,同时关闭A界面
- 重复1的操作,再打开B界面的时候报错,invalid 'cobj' in function 'lua_cocos2dx_Node_addChild'
在网上查询的原因是父节点被删除了,但是这个父节点所在界面是新添加的,不应该不存在或者被删除了。为了验证父节点是否还存在,用tolua.isnull(父节点)测试之后输出为true,证实是父节点不存在了。这个时候更加疑惑,为什么新添加的父节点会不存在???
经过网上查找资料和验证,找到了问题根源。我的界面管理是通过事件派发的形式,在主界面打开时注册所有相关子界面事件,存放到一个表中,关闭时把事件注销即清空事件列表。B界面的注销事件忘了添加,所以再次打开A界面时,事件列表中再次注册B界面事件失败,因为表中已存在(上次关闭A界面时未清除)。因为C++ 对象保存到 lua后,如果lua代码中还有使用这些数据,即使 C++ 对象已经被删除了,但 lua 数据仍然会存在。所以表中保存的是上次父节点数据,即已经被删除了,所以会报错。
解决方法:关闭界面时把未删除的事件注销