LUA 删除一个类中的所有对象

需要迭代通过以下类创建的所有对象,并在它们变得无用后销毁它们;

Casing = {}
Casing.__index = Casing
sentArray = {}
function Casing.create(x, y, z)
    if x ~= nil and y ~= nil and z ~= nil then
        local _casing = {}
        setmetatable(_casing,Casing)
        --etc.
        return _casing
    end
end

编辑(答案):

这个问题的解决很简单:没有必要显式地解构或销毁变量。 Lua 会自动销毁未使用的变量并相应地取消引用它们——正如以下答案所示和解释的那样。

点赞
用户2505965
用户2505965

Lua中的表(Tables)将受到垃圾回收(GC)的影响。当表成为“无用”的时候,只需放弃所有引用,除非您已经关闭了垃圾回收,否则它们的“销毁”自然而然地发生。

以下是手动将表标记为垃圾回收的例子:

local mytable = {}

print(mytable)
print(collectgarbage('count'))

mytable = nil

collectgarbage()
print(collectgarbage('count'))

--[[stdout(近似):
  table: 0x7fa821c066f0
  23.7412109375
  22.81640625
]]

如果你想要记录你创建的实例,你可以将它们的引用存储在一个表中。只需将它们从表中删除就可以让垃圾回收清理它们,_假设_没有其他引用被保留。

以下是一个朴素的例子:

local my_instances = {}

local function create_instance ()
    local t = {}

    my_instances[#my_instances + 1] = t

    return t
end

local function destroy_instances ()
    for i = 1, #my_instances do
        my_instances[i] = nil
    end
end

或者,您可以创建一个弱表,这样您就可以操作任何仍然在程序中具有外部引用的实例。再次强调,当在此表之外的所有引用都丢失时,GC将启动。

local my_instances = setmetatable({}, {
    __mode = 'k'
})

local function create_instance ()
    local t = {}

    my_instances[t] = true

    return t
end
2016-11-10 03:05:09