2013-05-27 2 views
7

folgendes Beispiel:Luabridge schwacher Verweis auf LuaRef Daten

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

In luabridge, speichere ich die function() als LuaRef, die für die Container die Lebensdauer verlängert und es wird nicht GCed sein, weil es eine ist RefCountedObjectPtr

Hier

ist eine Abhilfe, die ich benutze eine schwache Tabelle zu verwenden, die funktioniert, aber es sieht hässlich aus:

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 

Gibt es eine Möglichkeit, eine LuaRef zu haben, die ähnlich funktioniert? Oder vielleicht gibt es eine andere Problemumgehung? Hier

Antwort

1

ist die Art, wie ich dieses Problem angesprochen:

  1. eine Wrapper-Klasse erstellen um C++ luabridge Klasse (Wenn Sie class Display.A() in C++ haben, erstellen Klasse A() in Lua)
  2. Shops einen schwacher Tisch im Innern, dass Hüllklasse (self.WeakTable={} und setmetatable(self.WeakTable, { __mode = 'k' }))
  3. im schwachen Tabelle Referenz-Selbst: (self.WeakTable.self=self)
  4. Pass self.WeakTable zu C++ und speichert als in LuaRef - dies wird gc
  5. wie so eine Wrapper-Funktion erstellen:

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

wenn Sie Ihre eigene Antwort akzeptieren, werden Sie weniger Menschen auf Ihre Frage suchen bekommen. Sie können es später noch akzeptieren. –