我了解到Swift使用自动引用计数(ARC)进行内存管理。我想知道它是如何工作的值类型(struct
)在Swift。
来自Swift语言指南上的ARC:
引用计数仅适用于类的实例。结构体和枚举是值类型,而不是引用类型,它们不是通过引用存储和传递的。
自动引用计数只适用于引用类型,因为这些类型是:
- 总是在堆上分配,因为
- 它们必须存在于内存中稳定的位置,以便您可以确保多个引用指向同一对象的所有元素实际上都指向相同的位置(这是标识对象概念的一部分)
这确实意味着某些系统必须跟踪诸如This (object)类型的实例何时不再被引用,以便可以清理分配。
相反,值类型不具有与对象相同的标识概念:
- 它们不需要在内存中有一个稳定的位置,并且每个拷贝的值与另一个具有相同属性的值是无法区分的,所以
- 每次你引用一个值类型,你得到一个的拷贝值(概念上;有一些优化可以避免不必要的复制)
值类型不需要分配,也不需要维护需要通过诸如取消初始化器之类的东西进行清理的状态。最终的结果是,不需要跟踪值最后一次使用的时间(因为没有严格需要的回收),因此不需要对清理进行引用计数。
高级注释:值类型可能会在堆上分配(特别是如果它们足够大的话),但这是Swift的一个实现细节。如果分配了一个struct
, Swift自己将代表你维护分配和释放,同时仍然通过值透明地传递它。对这个struct
有多个引用仍然是不可能的,所以引用计数仍然与它无关(例如,引用计数只能是0或1,所以跟踪它没有意义)。