给 UIViewController 变量分配了多少内存

How much memory is allocated to UIViewController variables

假设我有一个 class 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 中的对象是否被释放,释放内存?

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

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

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

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

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

进一步阅读 Swift 书:

Structures and Enumerations Are Value Types

Classes Are Reference Types

Automatic Reference Counting

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