Luabridge对LuaRef数据的弱引用

时间:2013-05-27 16:49:23

标签: c++ data-binding lua luabridge

考虑以下示例:

function Process()
    local Container=NewContainer()
    Container:On(EventType.Add,function()
        Container:DoSomething()
    end)
    -- Does not Garbage Collect
end

在luabridge中,我将function()存储为LuaRef,这延长了Container的生命周期,因为它不是GC,因为它是RefCountedObjectPtr

这是一个解决方法,我用来使用一个有效的弱表,但它看起来很难看:

function Process()
    local Container=NewContainer()
    local ParamsTable={ Container=Container }
    setmetatable(ParamsTable, { __mode = 'k' })

    Container:On(EventType.Add,function()
        ParamsTable.Container:DoSomething()
    end)
    -- Garbage Collects fine
end

有没有办法让LuaRef具有与此相似的功能?或许还有另一种解决方法?

1 个答案:

答案 0 :(得分:1)

以下是解决此问题的方法:

  1. 围绕C ++ luabridge类创建一个包装类(如果你在C ++中有class Display.A(),在Lua中创建类A()
  2. 将弱表存储在该包装类(self.WeakTable={}setmetatable(self.WeakTable, { __mode = 'k' })
  3. 在弱表中,引用self:(self.WeakTable.self=self
  4. self.WeakTable传递给C ++并以LuaRef的形式存储 - 这将是gc
  5. 创建一个像这样的包装函数:

    Container:On(EventType.Add,function(WeakTableParams) 
       WeakTableParams.self.Callback();
    end)