我怎样才能链在Lua中间的回报对象,而垃圾收集器立即销毁对象的函数调用?

问题描述 投票:2回答:1

我有一个行的在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
1个回答
0
投票

基于在评论我的问题,我所做的是删除lua_upvalueindex()业务功能调度,而是需要用户数据是回调函数的第一个参数的反馈。于是,我换点符号冒号表示,供应隐含self。一直无法重现崩溃以来。

我还是不明白为什么的upvalue没有被正确引用的函数调用之前计数。也许有一件在对象创建或缺少些什么。

© www.soinside.com 2019 - 2024. All rights reserved.