Lua中的基本类型:nil、boolean、number、string、function、userdata、thread、table,后四种为引用类型,在赋值、传参、函数返回等都操作是对象的引用
在没有引入弱表时,所有对象的引用皆为强引用,对于强引用表,当表中的对象没有任何引用才会被GC回收
例如:
--file:weakTest.lua
require "util"
local pos = {x = 800 , y = 400}
local size = {width = 500 , heigh = 300}
local note = {msg = "message", title = "Tips"}
local label= {}
label[1] = pos -->表中key为number类型,value为一个table
label[2] = size -->表中key为number类型,value为一个table
label[note] = "Use A Table As Key" -->表中key为table类型 ,value为一个string
label["id"] = 123456789 -->表中key为string类型 ,value为一个number
label["echo"] = function() print(label.id) end -->表中key为string类型 ,value为一个function
print("
--------------Set reference to nil,and Call collectgarbage()------------:")
-->设置pos,size表为nil,但是表label的1,2号索引仍在引用,所以label[1]、label[2]指向的对象不会被回收
pos = nil
size = nil
-->设置note表为nil,但是仍作为表label的key值被引用,所以不会被回收
note = nil
-->表labeld中string类型的key的value类型为number,都是值类型
label.id = nil
-->表labeld中string类型的key的value类型为function,function对象没有任何的其他引用,内存将会被回收
label.echo = nil
collectgarbage()
util:PairsPrint(label)
设置弱表之后,weak表中的引用是弱引用(weak reference),弱引用不会导致对象的引用计数变化。即如果一个对象只有一个弱引用指向它,那么GC将会自动回收该对象的内存:
print("
--------------Set Weak Table {__mode = "k"},and Call collectgarbage()------------:")
setmetatable(label,{__mode = "k"})
collectgarbage()
util:PairsPrint(label)
在弱表中的__mode字段可以取以下三个值:k、v、kv,其中"k"表示table.key是weak的,也就是table的keys是弱引用可以被自动回收, "v"表示table.value是弱引用,也就是table的values能被自动回收, "kv"即是key和value都是弱引用,当一个对象只有若有用时那么这个keyvaluepair将被从表中移除
输入结果:
REF