cocos2d-x C++对象在lua里的存储类型问题

来源:互联网 发布:oracle拷贝整个数据库 编辑:程序博客网 时间:2024/05/17 07:06

Tolua里面有几个APi       

       tolua_function(L,"type",tolua_bnd_type);

       tolua_function(L,"takeownership",tolua_bnd_takeownership);

       tolua_function(L,"releaseownership",tolua_bnd_releaseownership);

       tolua_function(L,"cast",tolua_bnd_cast);

       tolua_function(L,"isnull",tolua_bnd_isnulluserdata);

       tolua_function(L,"inherit", tolua_bnd_inherit);

具体代码可以参看tolua_map.c。其中type用来判断lua里存的c++对象的类名。Cast用来做向上、向下的强制转换。Tolua往lua里面传对象的时候会指定一个类型,然后通过这个类型找到一个元表(这个元表带有所导出c++对象的所有方法信息),如果之前这个对象没有存储在lua里面,tolua会新建一个userdata,同时把找到的元表给它。这个userdata如果没有被全局引用,可能会被垃圾回收掉。

     需要注意的几个问题!

1.      强制转换的问题:cast其本质是改变userdata的元表方法。如果当前是父类向其子类转换,其元表会改变,转换后的userdata不等于之前的userdata。如果当前是子类向其直接父类(注意是直接,不能是父类的父类)转换,其元表不会改变,转换后的userdata等于之前的userdata。查看当前是什么类用tolua.type()。如果需要了解具体实现机制,可以查看tolua_super这个表的实现

2.      c++对象在lua里面的存储问题:如果你是用局部变量保存的c++对象,可能会被随时回收,回收后下次c++通过tolua做传递的时候会新建一个userdata放在一个ubox表里面。所以lua里面得到的传递类型就是当前设置的类型。例如当前是CCObject。在lua里面就只能用CCObject的方法。当出现方法无法引用时,这个需要特别注意。可以选择用全局变量保存或者在底层传的时候一直保持正确的类型

3.      lua对象内存回收的问题:当c++对象析构时会通过toluafix_remove_ccobject_by_refid方法将lua对象置空。但是如果lua对象里面不只存有c++对象,需要注意把对象置空,防止被全局引用而不被回收

原创粉丝点击