我正在探索 Swift 值类型,尤其是结构,以便更好地了解它在不同场景中的用途。我很惊讶地看到如何使用枚举来构建二叉搜索树,使用 indirect
引入了一层薄薄的引用语义。
enum BinarySearchTree<T: Comparable> {
case empty
case leaf(T)
indirect case node(BinarySearchTree, T, BinarySearchTree)
}
现在谈到真正的问题,我正在努力寻找的是,值类型中的引用类型会发生什么。这种关系将如何运作?例如内存管理、对象生命周期。
例如
class B {
var data: Int = 0
deinit {
print("deallocated!")
}
}
struct A {
var b = B()
}
在上面的例子中,值类型持有对引用类型的引用。
deinit
什么时候会被调用?A
类型的每个新结构实例是否都将引用类B
的相同实例,或者它们是否不同。- 我需要注意什么,或者是代码味道?
- 还有什么事吗?
最佳答案
每个结构 A
copy 将共享对 B
的相同引用。从头开始创建的每个 新 结构 A
都将包含一个全新的 B
对象。
B.deint
将在 为零时调用 strong references 到它(例如,您的 var b
是这些强引用之一)。例如,如果只有 A
值持有对给定 B
对象的引用,那么这些值将需要超出范围以将对此对象(或其 盒装副本也会被释放,但这可能是另一个问题的主题。)
代码设计。如果这些听起来都太困惑并且阻碍了您的应用程序进展(到目前为止没有真正的实际好处),您也可以考虑将 B
重构为一个结构。例如,即使 Apple recommends considering value types设计您的模型层。 This blog post也可能有助于您下定决心。
关于swift - 值类型中的引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43218486/