Рассмотрим следующий пример:
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
что функции похожи на это? Или, может быть, есть другой обходной путь?
Вот как я подошел к этой проблеме:
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)
Других решений пока нет …