Luabridge 对 LuaRef 数据的弱引用。

考虑以下示例:

function Process()
    local Container=NewContainer()
    Container:On(EventType.Add,function()
        Container:DoSomething()
    end)
    -- 不会垃圾回收
end

在 luabridge 中,我将 function() 存储为 LuaRef,它扩展了 Container 的生命周期,并且由于它是一个 RefCountedObjectPtr,因此它不会被垃圾回收。

以下是我使用的解决方法,使用了一个单独的弱表,它可以正常工作,但看起来很丑陋:

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

    Container:On(EventType.Add,function()
        ParamsTable.Container:DoSomething()
    end)
    -- 可以正常垃圾回收
end

是否有一种类似于此的工作方式的 LuaRef?或者还有其他解决方法吗?

点赞
用户965619
用户965619

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

  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-这将进行垃圾收集

  5. 创建一个包装函数,如下所示:

    Container:On(EventType.Add,function(WeakTableParams)
       WeakTableParams.self.Callback();
    end)
    
    以下是我解决这个问题的方法:
    
    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`-这将进行垃圾收集
     5. 创建一个包装函数,如下所示:
    
    

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

    ```

2013-05-30 15:51:24