自动引用计数在Swift中如何处理值类型?

3

我了解到Swift使用自动引用计数(ARC)进行内存管理。我想知道它如何处理Swift中的值类型(struct)。


2
它不适用于结构体。ARC仅适用于类,如果您想了解更多信息,可以阅读Swift编程语言书中的章节自动引用计数 - Joakim Danielson
1个回答

6
根据Swift中自动引用计数(ARC)的指南,引用计数仅适用于类的实例。结构体和枚举是值类型,而不是引用类型,不存储也不通过引用传递。
自动引用计数仅适用于引用类型,因为这些类型是:
1. 始终分配在堆上,因为 2. 它们必须存在于内存中的稳定位置,以便您可以确信多个引用指向同一个对象实际上都指向完全相同的位置(这是对象标识概念的一部分)
这意味着某个系统必须跟踪此类型(对象)的实例何时不再被引用,以便可以清理分配。
相反,值类型没有与对象相同的标识概念:
1. 它们不需要内存中的稳定位置,每个具有相同属性的值的副本都是无法区分的,因此 2. 每次引用值类型时,您都会按值复制它(从概念上讲;有优化可避免不必要的复制)
值类型不需要分配,并且不维护需要通过类似析构函数的清理状态。因此,没有必要跟踪最后使用值的时间(因为不需要严格的释放),因此不需要引用计数进行清理。
高级注释:值类型可能分配在堆上(特别是如果它们足够大),但这是Swift的实现细节。如果分配了一个struct,Swift本身将代表您维护分配和清理,同时通过值透明地传递它。仍然不可能对此struct有多个引用,因此引用计数对它不相关(例如,引用计数只能为0或1,因此跟踪没有意义)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接