ARC 不适用于 struct 和 enum,它们如何在 Swift 中释放

Ash*_*hra 1 memory-management structure value-type automatic-ref-counting swift

由于 ARC 不适用于 struct 和 enum,那么它们如何从内存中释放?当它在面试中被问到时,我不得不陷入困境并试图找到正确的答案,但在谷歌上找不到太多关于它的信息。我知道 swift 在处理值类型方面很聪明。但是如何?

Ale*_*ica 5

对象(类的实例)的内存管理相对困难,因为对象可能比函数调用、其他对象的生命周期,甚至分配它们的线程的生命周期更长。它们是堆上的独立实体,需要记账以确保它们在不需要时被释放(一旦它们不再被任何其他线程/对象引用,它们就无法访问,因此不能可能需要,因此可以安全删除)。

另一方面,结构体和枚举只是内联存储它们的实例。如果它们被声明为局部变量,它们将被分配在堆栈上(或在寄存器中,但没关系)。如果它们被分配为另一个对象的属性,它们只是直接内联存储在该对象中。它们只会因为它们的包含上下文被释放而被删除,例如当一个函数返回时,或者当一个对象被释放时。

  • 这几乎是正确的,只是有几个结构具有值语义(数组、字典、集合、字符串)并且实际上是作为引用实现的。同样,您可以拥有间接枚举和引用作为关联值,在所有这些情况下,必须从堆中释放对象,并且必须调用其 deinit。 (2认同)