Luabridge слабая ссылка на данные LuaRef
Рассмотрим следующий пример:
function Process()
local Container=NewContainer()
Container:On(EventType.Add,function()
Container:DoSomething()
end)
-- Does not Garbage Collect
end
В Луабридже я храню 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
Есть ли способ иметь LuaRef
что функции похожи на это? Или, может быть, есть другой обходной путь?
1 ответ
Решение
Вот как я подошел к этой проблеме:
- Создайте класс-оболочку вокруг класса C++ luabridge (если у вас есть
class Display.A()
в C++ создайте классA()
в Луа) - Храните слабую таблицу внутри этого класса-обёртки (
self.WeakTable={}
а такжеsetmetatable(self.WeakTable, { __mode = 'k' })
) - В слабой таблице ссылка на себя:(
self.WeakTable.self=self
) - Проходить
self.WeakTable
в C++ и хранить в видеLuaRef
- это будет gc Создайте функцию-обёртку так:
Container:On(EventType.Add,function(WeakTableParams) WeakTableParams.self.Callback(); end)