分三种表 弱 k 弱 v 弱 kv
1弱k就是当他的key本身需要做回收的时候,这个表的那一项就会被回收
2弱v就是当他的value本身需要做回收的时候,这个表的那一项就会被回收
3弱kv就是上述两种情况的并集
这里只需要几个 Lua 的示例即可
弱 Key 表的测试示例
1local weakkey_tbl = { __mode = "k" }
2 local t1 = setmetatable({}, weakkey_tbl)
3 -- 弱k,只要key是可回收的,就一定会回收
4 ga = {} -- global table a
5 gb = {} -- global table b
6
7 do
8 -- 这里的key都不会被回收
9 t1[1] = "test1"
10 -- 这里的value其实已经可以回收了,但是key不可回收,所以不回收
11 t1[2] = function() end
12 t1["test"] = "test2"
13
14 -- 这里的key都会被回收
15 local t_str3 = "test3"
16 local key = {}
17 t1[key] = t_str3
18
19 local t_str4 = "test4"
20 local xxfunc = function() end
21 t1[xxfunc] = t_str4
22
23 local tv1 = {}
24 local tv2 = {}
25 t1[tv1] = tv2
26 t1[tv2] = tv1
27 t1[ga] = gb
28 t1[gb] = ga
29 end
30
31 ga = nil
32 gb = nil
33
34 collectgarbage()
35
36 print("------------------")
37 for k, v in pairs(t1) do
38 print(k, v)
39 end
弱 Value 表的测试示例
1local weakvalue_tbl = { __mode = "v" }
2 local t2 = setmetatable({}, weakvalue_tbl)
3 -- 弱值表只要你的value是可以回收的状态,那么对应的kv就都会被回收
4 do
5 -- 不会被回收
6 t2[1] = 1
7 t2[2] = "test2"
8 local function func()
9 -- body
10 end
11 -- key其实可以可以回收了,但是value不可回收,所以不会被回收
12 t2[func] = "test3"
13
14 -- 会被回收
15 t2[3] = function() end
16 t2["xxfunc"] = function() end
17 local vtbl = {}
18 t2["xxfunc2"] = vtbl
19 end
20
21 collectgarbage()
22
23 print("------------------")
24 for k, v in pairs(t2) do
25 print(k, v)
26 end
弱 kv 表的测试示例
1local weakkv_tbl = { __mode = "kv" }
2 local t3 = setmetatable({}, weakkv_tbl)
3 do
4 -- 不可回收
5 t3[1] = "test1"
6 -- value可回收,直接回收
7 t3[2] = function() end
8 -- 不可回收
9 t3["test2"] = "test2"
10
11 -- key可回收,直接回收
12 local key = {}
13 t3[key] = "test3"
14
15 -- key可回收,直接回收
16 local xxfunc = function() end
17 t3[xxfunc] = "test4"
18 end
19
20 collectgarbage()
21
22 print("------------------")
23 for k, v in pairs(t3) do
24 print(k, v)
25 end