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