Lua笔记——6.弱表Weak Table

Lua中的基本类型:nil、boolean、number、string、function、userdata、thread、table,后四种为引用类型,在赋值、传参、函数返回等都操作是对象的引用

在没有引入弱表时,所有对象的引用皆为强引用,对于强引用表,当表中的对象没有任何引用才会被GC回收

例如:

    
    --file:weakTest.lua
    require "util"
    
    local pos = {x = 800 , y = 400}
    local size = {width = 500 , heigh = 300}
    local note = {msg = "message", title = "Tips"}
    
    local label= {}
    label[1] = pos                                   -->表中key为number类型,value为一个table
    label[2] = size                                  -->表中key为number类型,value为一个table
    label[note] = "Use A Table As Key"               -->表中key为table类型 ,value为一个string   
    label["id"] = 123456789                          -->表中key为string类型 ,value为一个number
    label["echo"] = function() print(label.id) end   -->表中key为string类型 ,value为一个function
    
    print("\n--------------Set reference to nil,and Call collectgarbage()------------:")
    -->设置pos,size表为nil,但是表label的1,2号索引仍在引用,所以label[1]、label[2]指向的对象不会被回收
    pos = nil                                        
    size = nil                                       
    -->设置note表为nil,但是仍作为表label的key值被引用,所以不会被回收
    note = nil
    -->表labeld中string类型的key的value类型为number,都是值类型
    label.id = nil
    -->表labeld中string类型的key的value类型为function,function对象没有任何的其他引用,内存将会被回收
    label.echo = nil
    collectgarbage()
    util:PairsPrint(label)

设置弱表之后,weak表中的引用是弱引用(weak reference),弱引用不会导致对象的引用计数变化。即如果一个对象只有一个弱引用指向它,那么GC将会自动回收该对象的内存:


    print("\n--------------Set Weak Table {__mode = \"k\"},and Call collectgarbage()------------:")
    setmetatable(label,{__mode = "k"})
    collectgarbage()
    util:PairsPrint(label)

在弱表中的__mode字段可以取以下三个值:k、v、kv,其中"k"表示table.key是weak的,也就是table的keys是弱引用可以被自动回收, "v"表示table.value是弱引用,也就是table的values能被自动回收, "kv"即是key和value都是弱引用,当一个对象只有若有用时那么这个keyvaluepair将被从表中移除

输入结果:

qGKyaJQ.png

转载于:https://www.cnblogs.com/sylvan/p/9688519.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值