zoukankan      html  css  js  c++  java
  • Chapter 17_4 终结器

      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[1]) end }
    list = nil
    for i = 1, 3 do
        list = setmetatable({i , link = list}, mt )
    end
    list = nil
    collectgarbage()
    --> 3
    --> 2 
    --> 1

    未完待续.....

    以上内容来自:《Lua程序设计第二版》和《Programming in Lua  third edition 》

  • 相关阅读:
    Avizo
    NEWS
    HOWTO
    InstallShield 2012 Spring优惠升级到最新版本(2015.4.30之前)
    Windows系统补丁KB2962872导致InstallShield无法启动(解决方案已更新)
    HOWTO: InstallScript MSI工程取Log
    安装软件列表
    阿里云推荐码 hut29f
    ios 缺少合规证明
    ios开发错误之: Undefined symbols for architecture x86_64
  • 原文地址:https://www.cnblogs.com/daiker/p/5886440.html
Copyright © 2011-2022 走看看