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 что функции похожи на это? Или, может быть, есть другой обходной путь?

7

Решение

Вот как я подошел к этой проблеме:

  1. Создайте класс-оболочку вокруг класса C ++ luabridge (если у вас есть class Display.A() в C ++ создайте класс A() в Луа)
  2. Хранить слабую таблицу внутри этого класса-обёртки (self.WeakTable={} а также setmetatable(self.WeakTable, { __mode = 'k' }))
  3. В слабой таблице ссылка на себя 🙁self.WeakTable.self=self)
  4. Проходить self.WeakTable в C ++ и хранить в виде LuaRef — это будет gc
  5. Создайте функцию-обёртку так:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]