doc
parent
a8186c351a
commit
b83ca2aca8
|
@ -18,6 +18,15 @@
|
||||||
|
|
||||||
# 3. 引用计数
|
# 3. 引用计数
|
||||||
|
|
||||||
|
- 对于创建的每一个对象都有一个与之关联的计数器,这个计数器记录着该对象被使用的次数
|
||||||
|
- 可以立即回收垃圾。因为每个对象在被引用次数为0的时候,是立即就可以知道的。
|
||||||
|
- 没有暂停时间。这个很容易理解,对象的回收根本不需要另外的GC线程专门去做,业务线程自己就搞定了。
|
||||||
|
- 不需要stop the world,当然,在多线程的情况下,必要的同步和互斥操作还是需要的。
|
||||||
|
|
||||||
|
- 一个致命缺陷是循环引用,就是, objA引用了objB,objB也引用了objA。这种情况下,这两个对象是不能被回收的。
|
||||||
|
![Image text](image/cycle.JPG)
|
||||||
|
|
||||||
|
|
||||||
- 可以使用unreference去释放引用计数的对象
|
- 可以使用unreference去释放引用计数的对象
|
||||||
|
|
||||||
- 引用计数既保留了性能,也保证了更加高效的性能
|
- 引用计数既保留了性能,也保证了更加高效的性能
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 56 KiB |
|
@ -5,8 +5,8 @@ const B = preload("res://script/demo02_base/B.gd")
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
#referenceTest()
|
#referenceTest()
|
||||||
referenceCycleTest()
|
#referenceCycleTest()
|
||||||
#referenceUnreference1Test()
|
referenceUnreference1Test()
|
||||||
#referenceUnreference2Test()
|
#referenceUnreference2Test()
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -28,12 +28,11 @@ func referenceUnreference1Test():
|
||||||
a.b = b
|
a.b = b
|
||||||
b.a = a
|
b.a = a
|
||||||
a.unreference()
|
a.unreference()
|
||||||
b.unreference()
|
|
||||||
|
|
||||||
func referenceUnreference2Test():
|
func referenceUnreference2Test():
|
||||||
var a = A.new()
|
var a = A.new()
|
||||||
var b = B.new()
|
var b = B.new()
|
||||||
a.b = b
|
a.b = b
|
||||||
b.a = a
|
b.a = a
|
||||||
a.b.unreference()
|
a.unreference()
|
||||||
b.a.unreference()
|
b.unreference()
|
||||||
|
|
Loading…
Reference in New Issue