关于Lua的垃圾回收机制(1)----------Weak Reference(弱引用)

垃圾收集

总的来说,lua比较智能,垃圾的回收对于程序员来说是相对透明的。然而再智能也比不过人,所以最好的方法是在智能回收的基础上再加上几种人工的辅助,让其发挥最大作用。弱引用表就是用来辅助垃圾回收机制的存在。

什么是弱引用表

首先看一段代码
在这里插入图片描述
在这里插入图片描述
上面的例子表明,当一个表的键引用了一个对象,那么即使后期这个对象为空,在这个表中这个键也会存在。这就是lua中的一个设定:任何被表引用的对象,即使你永远用不到它也没有其他地方引用它,它都不会被回收。 也就是说,我们如果想彻底把key1有关的信息都删除回收,那么我们只能手动的先去把 t[key1] = nil,再把 key1 = nil。但是这样也太麻烦了吧,程序员都是很懒的呀。那么有没有方法可以让我们省去手动的操作,自动的把我们不想要的对象回收呢?这就是弱引用表的作用了。它能让lua自动去回收一些不需要的对象,即使这个对象正在被这个弱引用表所引用。

弱引用表的三种模式

1.键为弱引用 __mode = “k”

在这里插入图片描述

在这里插入图片描述
最后结果只有wKey1,wKey2由于是作为weakT的键,当它被置位nil时,就被回收了。__mode = “k”,表明当弱引用表中的键引用的对象为空时,这个元素就会被回收。

2.值为弱引用 __mode = “v”

先看代码
在这里插入图片描述
首先定义一个弱引用表weakT,将它设置成值为弱引用的模式。定义两个表wKey1和wKey2,将它们作为weakT的值,将其中wKey2置位nil后垃圾回收,遍历weakT
在这里插入图片描述
不出意料,对于wKey2这个表来说,除了weakT外,再也没有引用它了,所以它就被回收了。所以总的来说,当你设置一个表__mode = "v"的时候,当表中的值所引用的对象为nil的时候,那么lua也会把这个值当做垃圾回收。emmmm,是不是很好理解。别急,继续看下面的特殊情况。
《Lua程序设计》讲到弱引用表的时候,说过一句:“请注意,只有对象可以从弱引用表中被移除,而像数字和bool这样的‘值’是不可回收的”。我用下面这个例子来解释这句话。

当引用的值不为对象时在这里插入d ddddd 图片描述
从结果看,weakT中的所有值都保留了,wKey1并没有被回收。这是因为wKey1是一个字符串,lua里面的字符串从程序员角度就是值类型,所以即使将它置位nil,也不会被回收。这就是书上那句话的意思。

键和值都为弱引用 __mode = “kv”

这就是上面两种情况的叠加,有兴趣的读者可以试下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值