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++对象,需要注意把对象置空,防止被全局引用而不被回收
- cocos2d-x C++对象在lua里的存储类型问题
- cocos2d-x LUA Binding实现C++里访问LUA的自定义对象
- 在Cocos Code IDE里打开cocos2d-x自带的lua测试项目 lua-tests
- cocos2d-x lua 类对象的使用
- cocos2d-x LUA 2.x里tolua++的一个隐患
- cocos2d-x lua 面向对象
- cocos2d-x 3.2里lua binding注意事项
- 数据在机器里的存储问题(c程序)
- 【cocos2d-x 3.5】Lua的简单面向对象
- cocos2d-x lua table数据存储
- Cocos2d-x Lua 获取设备类型
- 在VS2010下cocos2d-x与Lua的交互
- cocos2d-x在Lua下的常量定义
- cocos2d-x lua 初学以及碰到的问题(一)
- cocos2d-x 的lua继承
- cocos2d-x的lua绑定
- COCOS2D-X Lua面向对象编程
- COCOS2D-X Lua 面向对象编程
- SIP协议的功能在统一通信中的体现
- 手把手教你做iOS推送
- jquery1.9 checkbox选中问题
- 关于Linux cached内存简析
- C语言文件操作函数大全
- cocos2d-x C++对象在lua里的存储类型问题
- 中科院分词ICTCLAS5.0 配置错误处理
- UVA 11388 - GCD LCM
- C运行时库(C Run-time Library)详解
- zookeeper小记
- 第九周-求分数累加
- 四个数字按大小排序
- 2个对象去掉重复的,进行排序(人工干预和用户点击都要对比)
- 求 1-1/(2^1)+ +1/(2^8)