7

考虑以下示例:

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

在 luabridge 中,我存储了function()as LuaRef,它延长了 the 的生命周期,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

有什么办法可以实现LuaRef类似的功能吗?或者也许还有另一种解决方法?

4

1 回答 1

1

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

  1. 围绕 C++ luabridge 类创建一个包装类(如果你有C++,请在 Luaclass Display.A()中创建类)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)
    
于 2013-05-30T15:51:24.760 回答