Answers:
chi已回答了有关swift的特定问题,此答案回答了标题中较笼统的问题。
参考计数GC与跟踪GC是语言属性还是实现属性?
参考计数GC和跟踪GC为程序员提供了不同的保证。
引用计数可在程序流中破坏对象的位置提供确定性,如果对象拥有必须快速释放的稀缺资源,这可能很重要。另一方面,它不能处理“强”引用的循环。
取决于单个语言的规范,如果可以保证有任何特征,那么哪种选择对兼容的实现可用。
您可以采用称为Swift的语言,并将其重命名为“ Swift with ARC”。然后,您可以使用完全相同的语法创建一种名为“ Swift with GC”的新语言,但是对对象何时被释放的保证较少。
在带有ARC的Swift中,一旦引用计数为0,对象就会消失。使用垃圾回收,只要您有一个弱引用,就可以将该弱引用分配给强引用以“恢复”对象。(在Swift中,一旦引用计数为0,则弱引用为nil);那是一个主要的区别。
当然,带有ARC的Swift可以保证杀死最后一个引用计数将立即释放该对象。例如,您可能具有FileWriter类,在该类中,不允许您同时有两个实例写入同一文件。在带有ARC的Swift中,您可以说oldWriter = nil; newWriter = FileWriter(...),您将知道仅在删除旧FileWriter之后才创建新FileWriter(除非您保留了另一个引用);在带有GC的Swift中这是行不通的。
另一个区别是,在“快速与ARC”,即仅通过强引用循环引用,但实际上不是可达到的对象,被保证为不释放。
deinit
as关键字的存在及其关联的语义确实是使引用在语言(而不是实现领域)中正确计数的事物。