lua 元表中有个很好用的方法就是 __gc,这个方法是在 table 被回收时会触发的回调,可以用来做一些 lua内存泄露 及 资源释放 等操作
怎奈这个方法在 lua5.1 版本是不支持的,5.2以上的版本才可以直接使用。
大部分 unity 和 cocos2dx 接入的tolua应该用的lua都是5.1的版本吧。在 stackoverflow 上搜到一个lua5.1实现 __gc 的解决方案
lua5.2版本使用 __gc
使用非常简单
1 2 3 4 5 6 7
| local tab = { _name = "default" } setmetatable(tab, { __gc = function ( t ) print("__gc, _name:", t._name) end }) collectgarbage("collect")
|
结果:
1 2
| __gc, _name: default [Finished in 0.0s]
|
lua5.1版本使用 __gc
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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")
|
结果:
1 2
| cleaning up: yangx [Finished in 0.0s]
|