MEGALOVANIA MEGALOVANIA

游戏开发中

目录
Lua弱表笔记
/  

Lua弱表笔记

LUA 弱表的回收规则

分三种表 弱 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

标题:Lua弱表笔记
作者:matengli110
地址:https://www.sunsgo.world/articles/2021/12/23/1640253434156.html