lua弱引用学习笔记

--这个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"})其实就是上面两种的结合体


版权声明:本文为qq_35378268原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。