cocos2d-x C++对象在lua里的存储类型问题
2013-10-29 17:19
239 查看
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++对象,需要注意把对象置空,防止被全局引用而不被回收
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++对象,需要注意把对象置空,防止被全局引用而不被回收
相关文章推荐
- FieldGroup绑定的日期类型存储格式的问题
- cocos2d-x 快速熟悉Lua基本细节问题
- oracle中number数据类型的存储以及最大值问题
- Oracle Lob类型存储浅析( alter index lob索引 rebuild tablespace XX报错问题)
- cocos2d-x lua热更新问题,重载reload
- pytorch 中 numpy 类型与 torch 类型共享存储的问题
- 关于java的data类型向mysql的datetime中存储的问题
- cocos2d-lua ScaleTo函数细节问题
- cocos2d-x 创建lua项目问题
- cocos2d-x+lua+cocosbuilder+luaproxy开发中遇到的读取子node以及事件绑定问题
- Oracle定义varchar2()类型存储汉字的长度问题
- mysql数据库的Date类型日期存储问题
- 关于计算机中数据类型存储的对齐问题
- java中是如何解决编码问题的,比如char类型的对象是如何存储的呢?
- Cocos2d-x 3.0 Lua编程 之 响应物理引擎的Contact事件回调不运行的问题
- Oracle定义varchar2()类型存储汉字的长度问题
- Delphi中双字节类型存储到整型变量的问题
- cocos2d-x Lua使用pluginx中得IOSIAP遇到的问题
- 【Cocos2d-x Lua笔记六】游戏存储GameState