我有一个行的在Lua这样的代码:
mv.getLabelChildByNameSequence("confirm_btn|button|no_icon_txt").setVisible(false);
getLabelChildByNameSequence()
返回userdata
对象(创建的C侧),然后setVisible()
该对象上调用的函数。问题是,工作的大部分时间,但有些时候,垃圾收集器决定创建后立即销毁中间目标,以及声明的第二部分发生之前。
我发现这是比较成功的:
local no_icon_txt = mv.getLabelChildByNameSequence("confirm_btn|button|no_icon_txt");
no_icon_txt.setVisible(false);
我怀疑与明确local
变量,如预期计数作品裁判,并且对象不会被垃圾回收,直至局部变量超出范围。
我会第一个例子更喜欢第二个 - 这是很多更紧凑,更漂亮的寻找,而更像是你会像c++
语言看。我怎样才能做到这一点?
顺便说一句,当崩溃发生,它似乎,设法解决调用setVisible()
对象的旧内存地址尽管已经收集垃圾只是数据。好奇。
编辑:我想提一提我使用LunaFive
的绑定(http://lua-users.org/wiki/LunaFive)。用户数据推送FN看起来是这样的:
static void push(lua_State * L, T* instance )
{
T **a = (T **) lua_newuserdata(L, sizeof(T *)); // Create userdata
*a = instance;
luaL_getmetatable(L, T::className);
lua_setmetatable(L, -2);
}
和功能调度看起来是这样的:
static int function_dispatch(lua_State * L)
{
int i = (int) lua_tonumber(L, lua_upvalueindex(1));
T** obj = static_cast < T ** >(lua_touserdata(L, lua_upvalueindex(2)));
return ((*obj)->*(T::methods[i].func)) (L);
}
getLabelChildByNameSequence()
推动Label
类的新实例(假设),而setVisible()
是该类中的方法。
基于在评论我的问题,我所做的是删除lua_upvalueindex()
业务功能调度,而是需要用户数据是回调函数的第一个参数的反馈。于是,我换点符号冒号表示,供应隐含self
。一直无法重现崩溃以来。
我还是不明白为什么的upvalue没有被正确引用的函数调用之前计数。也许有一件在对象创建或缺少些什么。