没有垃圾收集的引用计数

时间:2012-07-15 19:51:22

标签: garbage-collection reference-counting

我正在学习编程语言设计课程,其中一个主题是垃圾收集。我从材料中了解到RC 可以用于GC,但它还有其他用途,有些语言实现RC而不是GC。
如果不是GC,究竟使用RC究竟是什么?

RC - 引用计数。 GC - 垃圾回收)

2 个答案:

答案 0 :(得分:3)

可以使用引用计数,例如,关闭未引用的文件句柄,或以某种方式“归档”当前未引用的数据(可能在将来通过某种间接路径重新引用)。

答案 1 :(得分:2)

我可以提供独立于垃圾收集使用的引用计数的特定示例。 Objective-C使用引用计数来管理其对象的生命周期,在大多数情况下不存在垃圾收集器。

这是通过在处理对象时对-retain-release进行平衡调用来完成的。基本上,创建一个保留计数为1的对象,并且每个需要保持对对象引用的对象在最初传递时应将其保留计数增加1,然后在完成时将保留计数减1它。导致对象保留计数降至0的最终-release调用(没有人应该再次需要它)触发对象类型的内部机制来解除分配。

不需要进行垃圾收集器处理。事实上,直到最近,Apple的平台(目前为Objective-C的最大用户)才有这种垃圾收集器,并且它甚至不用于iOS手机设备(现在已在Mac桌面上弃用)。

Objective-C中的引用计数默认是手动的,要求开发人员遵循某些约定,以确保您安全地平衡保留和释放调用,以避免泄漏或过早解除分配。一个较新的系统刚刚在LLVM编译器中实现,可以自动执行此操作,并在编译时添加适当的调用。这种自动引用计数消除了管理内存的大量工作,同时消除了对垃圾收集器进程扫描对象图的需要。

垃圾收集器可以处理引用计数的一个特定条件是检测和删除保留周期。在循环中保留对该点的强引用的对象将永远不会在标准引用计数下被释放,即使引用循环中的所有对象释放对其中的引用的引用也是如此。垃圾收集器将看到此循环不是以较大的对象图为根,并且能够在执行扫描时删除整个循环。