Lua中的垃圾回收主要是针对Lua对象,但是也可以做一些额外的资源管理工作。
可以为表设定垃圾收集的元方法(对于完全用户数据,则需要使用C API),该元方法称为 终结器。
Lua用"__gc" 元方法实现终结器:
o = {x = "hi" }
setmetatable(o , {__gc = function (o ) print (o.x) end } )
o = nil
collectgarbage() --> hi -- 触发元方法__gc
如果我们没有对对象进行__gc标记,它就不会终结。
在它之后才给元表加上这个__gc域,那么这个对象是没有被标记需要触发终结器的:
o = { x = "hi"}
mt = {}
setmetatable(o,mt )
mt.__gc = function(o) print(o.x) end
o = nil
collectgarbage() --> 不会打印任何东西
在标记__gc域后,还是可以*地改变其元表中的 “__gc” 域:
o = {x = "hi" }
mt = {__gc = true } --先用任何值给它赋值,作为占位符
setmetatable(o, mt )
mt.__gc = function(o) print (o.x) end --再次修改,也是可以的
o = nil
collectgarbage() --> hi
当用同一个循环对几个对象进行垃圾回收,调用终结器的顺序和标记对象__gc域的顺序刚好相反。
mt = { __gc = function (o) print (o[]) end }
list = nil
for i = , do
list = setmetatable({i , link = list}, mt )
end
list = nil
collectgarbage()
--> 3
--> 2
--> 1
未完待续.....
以上内容来自:《Lua程序设计第二版》和《Programming in Lua third edition 》