垃圾收集
总的来说,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这样的‘值’是不可回收的”。我用下面这个例子来解释这句话。
从结果看,weakT中的所有值都保留了,wKey1并没有被回收。这是因为wKey1是一个字符串,lua里面的字符串从程序员角度就是值类型,所以即使将它置位nil,也不会被回收。这就是书上那句话的意思。
键和值都为弱引用 __mode = “kv”
这就是上面两种情况的叠加,有兴趣的读者可以试下。
|
请发表评论