Luabridge对LuaRef数据的弱引用

Gra*_*pes 7 c++ data-binding lua luabridge

请考虑以下示例:

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

在luabridge,我保存function()LuaRef延伸寿命的Container,它不会是GCed因为它是一个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
Run Code Online (Sandbox Code Playgroud)

有没有办法让LuaRef这个功能与此类似?或许还有另一种解决方法?

Gra*_*pes 1

这是我解决这个问题的方法:

  1. 围绕 C++ luabridge 类创建一个包装类(如果您有C++ 类,请在 Lua 中class Display.A()创建类)A()
  2. 在该包装类中存储一个弱表(self.WeakTable={}setmetatable(self.WeakTable, { __mode = 'k' })
  3. 在弱表中,引用 self: ( self.WeakTable.self=self)
  4. 传递self.WeakTable给 C++ 并存储在 as 中LuaRef- 这将进行 gc
  5. 创建一个包装函数,如下所示:

    Container:On(EventType.Add,function(WeakTableParams) 
       WeakTableParams.self.Callback();
    end)
    
    Run Code Online (Sandbox Code Playgroud)