lua引入弱引用的机制导致被引用的对象的引用计数不会变化,从而当将某个被引用的对象重置为nil的时候垃圾回收能够回收内存,更利于内存的释放,但是一旦使用弱引用如果一个表使用了另外一个对象当做key或者value,一旦key或者value重置为nil的时候,这个对象也就随之被删除。
弱引用的使用:三种使用方式:k,v,kv
顾名思义:
1: k的意思就是对指定对键的弱引用。
2: v的意思就是对指定值得弱引用。
3: kv的意思就是对指定键和值得弱引用。
-- t1 = {};
-- t2 = {};
-- t = {};
-- t[1] = t1;
-- t[2] = t2;
-- t[3] = 10;
-- t1 = nil;
-- t2 = nil;
-- print("t's len is " .. #t);
-- collectgarbage();
-- print("t's len is " .. #t);
local t = {};
-- 将表设置为元表后,通过__mode = "k"
-- 将其指定为对键的弱引用,也就是说,一旦表中的某个键被垃圾回收,t中会删除
setmetatable(t, { __mode = "kv" });
key1 = { name = "key1" };
t[key1] = 1;
key1 = nil;
key2 = { name = "key2" };
t[key2] = 1;
key2 = nil;
for key, value in pairs(t) do
print(key.name, value)
end
collectgarbage();
for key, value in pairs(t) do
print(key.name, value)
end