lua5.1中实现__gc

来源:互联网 发布:ffmeg-java 编辑:程序博客网 时间:2024/05/22 13:11

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)endlocal function gctest(self)    print("cleaning up: ", self._name)endlocal test = setmt__gc({_name = "yangx"}, {__gc = gctest}) collectgarbage("collect") -- 强制垃圾回收

结果:

cleaning up: yangx[Finished in 0.0s]

  • 参考链接
    • http://stackoverflow.com/questions/27426704/lua-5-1-workaround-for-gc-metamethod-for-tables
0 0
原创粉丝点击