报错:invalid 'cobj' in function 'lua_cocos2dx_Node_addChild'

在使用cocos2dx-lua开发时,遇到一个错误:invalid 'cobj' in function 'lua_cocos2dx_Node_addChild'。问题出现在打开和关闭界面的过程中,由于父节点在关闭时未正确清理,导致再次打开时父节点不存在。通过检查发现,是由于在界面管理中,B界面的事件注销忘记处理,导致C++对象已被删除但lua中仍有引用。解决方法是在关闭界面时确保所有相关事件被注销,以避免引用已删除的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在测试项目过程中,二次打开某一个界面,碰到了这个报错。问题复现过程:

  1. 打开A界面(父节点所在界面),在A界面中点击按钮打开子界面B添加到父节点中  
  2. 操作完成后关闭B界面,同时关闭A界面
  3. 重复1的操作,再打开B界面的时候报错,invalid 'cobj' in function 'lua_cocos2dx_Node_addChild'

在网上查询的原因是父节点被删除了,但是这个父节点所在界面是新添加的,不应该不存在或者被删除了。为了验证父节点是否还存在,用tolua.isnull(父节点)测试之后输出为true,证实是父节点不存在了。这个时候更加疑惑,为什么新添加的父节点会不存在???

经过网上查找资料和验证,找到了问题根源。我的界面管理是通过事件派发的形式,在主界面打开时注册所有相关子界面事件,存放到一个表中,关闭时把事件注销即清空事件列表。B界面的注销事件忘了添加,所以再次打开A界面时,事件列表中再次注册B界面事件失败,因为表中已存在(上次关闭A界面时未清除)。因为C++ 对象保存到 lua后,如果lua代码中还有使用这些数据,即使 C++ 对象已经被删除了,但 lua 数据仍然会存在。所以表中保存的是上次父节点数据,即已经被删除了,所以会报错。

解决方法:关闭界面时把未删除的事件注销

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值