--这个lua弱引用平常很少用到,可能会忘,做个学习记录,应该是只对table有效的
--1、什么也没有处理
local base = {}
local t1 = {name = "test"}
--使用一个table作为key值
base[t1] = 3
t1 = nil
-- 强制进行一次垃圾收集
collectgarbage()
for key, value in pairs(base) do
print(tostring(key.name) ..":" .. tostring(value))
end
--因为base还保留着对t1的引用 输出 test:3
--2、设置key弱引用
local base = {}
--给table添加__mode元方法,如果这个元方法的值包含了字符串“k”,就代表这个table的key都是弱引用的。
--一旦其他地方对于key值的引用取消了(设置为nil),那么,这个table里的这个字段也会被删除。
setmetatable(base,{__mode = "k"})
local t1 = {name = "test"}
base[t1] = 3
--如果出现 local t2 = t1 也要吧t2 = nil 才会被删除
t1 = nil
-- 强制进行一次垃圾收集
collectgarbage()
for key, value in pairs(base) do
print(tostring(key.name) ..":" .. tostring(value))
end
--因为设置了key的弱引用 此时没有输出
--3、设置value弱引用
local base = {}
--给table添加__mode元方法,如果这个元方法的值包含了字符串“v”,就代表这个table的value都是弱引用的。
--一旦其他地方对于key值的引用取消了(设置为nil),那么,这个table里的这个字段也会被删除。
setmetatable(base,{__mode = "v"})
local t1 = {name = "test"}
base[3] = t1
--如果出现 local t2 = t1 也要吧t2 = nil 才会被删除
t1 = nil
-- 强制进行一次垃圾收集
collectgarbage()
for key, value in pairs(base) do
print(tostring(key) ..":" .. tostring(value.name))
end
--因为设置了value的弱引用 此时没有输出
--4、设置key,value弱引用,setmetatable(base,{__mode = "kv"})其实就是上面两种的结合体