弱表 指内部元素为 弱引用 的表。 垃圾收集器会将弱引用视为无引用。如果一个对象只被弱引用引用到, 垃圾收集器就会回收这个对象。
弱表什么时候会用到呢,先看下面的例子:
local t={}
--用k来做t的key,将1存入t
local k={}
t[k]=1
--重新生成一个table'k' ,并作为key将2存入t
k={}
t[k]=2
--垃圾回收
collectgarbage()
for k,v in pairs(t) do
print(k,v)
end
输出:
table: 00000000006e9ba0 1
table: 00000000006e98e0 2
可以看到,当我们为k重新创建一个table,并再次作为key存入t中时,t中第一个key-value的键值对依然存在。
这时,一般来讲,我们不会再用到第一个键值对了,但是t保持着对其的引用,导致第一个table无法被回收。
弱表在这个时候就派上用场了。我们可以将t指定为弱表。
一个table的弱引用类型是通过其元表的__mode字段来决定的。
使用方法很简单,只需要给t的元表加上__mode字段即可。
setmetatable(t,{__mode='k'})
--'k'代表table是key弱引用,'v'代表table是value弱引用,'kv'代表table是key-value弱引用
将t设置为弱表后再执行一次
local t={}
setmetatable(t,{__mode='k'})
local k={}
t[k]=1
k={}
t[k]=2
collectgarbage()
for k,v in pairs(t) do
print(k,v)
end
输出:
table: 00000000001b9920 2
第一个table就被正常回收了,并且t中自动帮我们移除了第一个键值对。