【问题标题】:How much memory is allocated to UIViewController variables为 UIViewController 变量分配了多少内存
【发布时间】:2017-10-04 22:07:39
【问题描述】:

假设我有一堂课Animal

class Animal: NSObject {
  var name: String = ""
  var weight: Double = 0
}

在我的视图控制器 #1 中,我有一个由这些对象组成的数组:

class ViewController1: UIViewController {
  var animals: [Animal] = [ .... ]

  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let v = segue.destination as? ViewController2 {
      v.mammals = self.animals.filter(...) // Are my objects duplicated?
    }
  }
}

class ViewController2: UIViewController {
  var mammals: [Animal] = [ .... ]
}

当我从 VC1 过滤它们并将它们的子集传递给 VC2 时,我的 Animal 对象是否重复?当我从 VC2 返回到 VC1(即弹出导航堆栈)时,mammals 中的对象是否已释放,释放内存?

编辑:这会创建任何类型的保留周期吗??

【问题讨论】:

    标签: ios swift memory-management uiviewcontroller retain-cycle


    【解决方案1】:

    在 Swift 中,类是引用类型,因此它们不会被复制。 Array 是一个结构体,它是一个值类型,因此它们会被复制。

    因此,当数组被复制时,其中的 Animal 对象不会。两个数组都将引用一组 Animal 对象。如果您更改 Animal 对象之一,无论您从哪个数组访问它,您都会看到更改。

    ViewController2 被解除时,只要没有其他强引用它,它就会被解除分配,它的所有属性也会被解除分配。 mammals 数组将被释放。其中的Animal 对象是否被释放取决于这些对象是否有其他强引用。

    过滤Animal 对象数组不会导致引用循环。

    进一步阅读 Swift 书籍:

    Structures and Enumerations Are Value Types

    Classes Are Reference Types

    Automatic Reference Counting

    【讨论】:

      【解决方案2】:

      你做这样的事情是完全安全的。正如您所说,要复制的是数组。数组本身是一种值类型,但它存储类类型或对对象的引用。因此值(地址)将被复制,但这些地址仍然指向您在动物数组中拥有的相同对象。哺乳动物从内存中删除后,仅删除其值,值是对象的地址,而不是对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-28
        • 1970-01-01
        • 2017-01-30
        • 2011-01-03
        • 2017-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多