swift - 值类型中的引用类型

标签 swift memory-management value-type reference-type deinit

我正在探索 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()
}

在上面的例子中,值类型持有对引用类型的引用。

  1. deinit 什么时候会被调用?
  2. A 类型的每个新结构实例是否都将引用类 B 的相同实例,或者它们是否不同。
  3. 我需要注意什么,或者是代码味道?
  4. 还有什么事吗?

最佳答案

每个结构 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/

相关文章:

ios - 我无法在 Swift 项目的两个目标中使用我的核心数据模型

javascript - 如何关闭内存GCed?

c++ - Linux:/proc/self/statm 可信吗?

c++ - 使用成员函数初始化数据成员

arrays - 如果数组是值类型并因此被复制,那么它们为什么不是线程安全的呢?

c# - 取任意值类型的数组作为形参

c# - 比较转换为对象的值类型

ios - swift 在 Iphone 上的屏幕截图只有白色背景

ios - 在 CallKit UI 中隐藏 FaceTime 按钮

ios - 修改数组中的 Realm 对象而不提交?