参考类型内部值类型

Rah*_*hul 4 memory-management value-type reference-type swift deinit

我正在探索Swift值类型特别是结构,以便更好地理解它在不同场景中的用途.我很惊讶地看到如何使用枚举来构建二进制搜索树,使用indirect它可以引入一层薄薄的引用语义.

enum BinarySearchTree<T: Comparable> {
  case empty
  case leaf(T)
  indirect case node(BinarySearchTree, T, BinarySearchTree)
}
Run Code Online (Sandbox Code Playgroud)

现在提出真正的问题,我正在努力寻找的是,在值类型中引用类型会发生什么.这段关系将如何运作?像内存管理,对象生命周期.

例如

class B {
    var data: Int = 0

    deinit {
        print("deallocated!")
    }

}

struct A {
    var b = B()
}
Run Code Online (Sandbox Code Playgroud)

在上述情况下,值类型包含对引用类型的引用.

  1. 何时deinit会被召唤?
  2. 每个类型的新结构实例是否都会A引用同一个类实例,B或者它们是不同的.
  3. 我需要注意什么,或者是代码味道?
  4. 还要别的吗?

Pau*_*tos 6

每个结构A 副本都将共享相同的引用B.从头开始创建的每个结构A都将包含一个全新的B对象.

B.deint当有零个将被称为强引用它(例如,您var b是这些强引用的一个).例如,如果只有A值保存对给定B对象的引用,那么那些将需要超出范围以将对该对象的所有引用归零(或者它们的盒装副本也将被释放,但这可能是另一个问题的主题.)

代码设计.如果这些听起来太混乱并阻碍了您的应用程序进度(到目前为止没有真正的实际好处),您也可以考虑重构B一个结构.例如,即使Apple建议考虑使用值类型来设计模型层.这篇博客文章也可能有助于下定决心.