key1 = {"one"} key2 = {"two"} t = {} setmetatable(t,{__mode="kv"}) t[key1] = 10 key1 = nil t[key2] = 100 key2 = nil collectgarbage() --主动调用gc回收垃圾 for k,v in pairs(t) do print(k,v) end
t的key值是一些table,后面被赋值为nil了,表明其实这条数据是不需要的了,但是gc是不知道的,这些table的key被存在的table引用着。
所以使用弱引用,设置table的元表的元方法__mode(一个字符串),带有k表示key值为弱引用,带有v表示value是弱引用,反正出现弱引用的值被nil了,整个条目都会被移除。