2013-05-27 4 views
7

Rozważmy następujący przykład:Luabridge słabe odniesienie do danych LuaRef

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

W luabridge, przechowywać function() jak LuaRef który przedłuża żywotność dla Container i nie będzie GCed bo to RefCountedObjectPtr

Tutaj jest rozwiązanie, które używam w użyciu słabego tabeli, która działa, ale wygląda brzydko:

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 

Czy jest jakiś sposób, aby uzyskać LuaRef, który działa podobnie do tego? A może jest inne obejście?

Odpowiedz

1

Oto sposób podszedłem do tego problemu:

  1. utworzyć klasy otoki wokół C++ luabridge klasa (Jeśli masz class Display.A() w C++, utworzyć klasę A() w Lua)
  2. Store słaby stół w środku, że Klasa osłony (self.WeakTable={} i setmetatable(self.WeakTable, { __mode = 'k' }))
  3. w słabym tabeli samo odniesienie: (self.WeakTable.self=self)
  4. Przełęcz self.WeakTable do C++ i przechowywać jako LuaRef - będzie GC
  5. Tworzenie funkcji otoki tak:

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

jeśli przyjąć swoją odpowiedź, dostaniesz mniej ludzi patrzeć na swoje pytanie. Nadal możesz je zaakceptować później. –

Powiązane problemy