lua-lua5.1中实现__gc

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]