Dorothy中对象引用的问题

 在使用Dorothy时遇到了一些诡异的现象。大概的代码类似这样:

	-- 核心的伪代码如下
	local scene = CCScene()
	local world = oWorld()
	
	local body = oBody(...)
	local joint = oJoint(...)
	body.joint = joint
	world:addChild(body)
	
	scene:addChild(world)
	CCDirector:run(scene)

  除去最基本的框架代码,要做的事情很简单,创建了body和joint两个对象,然后把其中joint对象reference到body上,又把body添加到游戏世界中。
  实际运行的效果是,joint关节在创建后将body对象按预期效果固定住了,然后等待游戏运行一段时间后,joint对象居然自动销毁了导致之前固定的body掉了下来。说明这样做joint对象并没有真正地添加到reference链上,结果在GC的时候就被清理掉了。那么这样的写法有什么问题吗?
  在lua绑定系统中,C++对象和Lua对象的生命周期不是同步的,我们使用的body对象既是一个C++的对象,也对应一个Lua userdata的对象,Lua userdata由Lua的GC系统管理,C++对象的生命周期用reference counting管理。在执行world:addChild(body)时,我们只是通过lua代码访问C++的接口,将body的C++对象添加到world的子节点树中,让body的C++对象得到了引用。但是body在Lua层面上创建的userdata对象并没有被引用。reference链从body开始就断开了。

在Lua中和C++对象引用状态的不同

在Lua中和C++对象引用状态的不同

  有两种解决的方法,一种是给joint添加引用,比如把joint挂在全局对象上,CCDirector.joint = joint;另一种方法是将joint的C++实体挂在C++系统中,使用以下代码可以实现这个效果:

	-- 在C++中建立body对joint的引用
	body.data = CCDictionary()
	body.data.joint = joint
	-- 获取joint
	local myJoint = body.data.joint
标题目录