lua 元表中有个很好用的方法就是 __gc,这个方法是在 table 被回收时会触发的回调,可以用来做一些 lua内存泄露 及 资源释放 等操作
怎奈这个方法在 lua5.1 版本是不支持的,5.2以上的版本才可以直接使用。
大部分 unity 和 cocos2dx 接入的tolua应该用的lua都是5.1的版本吧。在 stackoverflow 上搜到一个lua5.1实现 __gc 的解决方案
lua5.2版本使用 __gc
使用非常简单
local tab = { _name = "default" }
setmetatable(tab, {
__gc = function ( t )
print("__gc, _name:", t._name)
end
})
collectgarbage("collect") -- 强制垃圾回收
结果:
__gc, _name: default
[Finished in 0.0s]
lua5.1版本使用 __gc
local function setmt__gc(t, mt)
local prox = newproxy(true)
getmetatable(prox).__gc = function() mt.__gc(t) end
t[prox] = true
return setmetatable(t, mt)
end
local function gctest(self)
print("cleaning up: ", self._name)
end
local test = setmt__gc({_name = "yangx"}, {__gc = gctest})
collectgarbage("collect") -- 强制垃圾回收
结果:
cleaning up: yangx
[Finished in 0.0s]