ios - 给 UIViewController 变量分配了多少内存

标签 ios swift memory-management uiviewcontroller retain-cycle

假设我有一个类 Animal

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

在我的 View Controller #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

关于ios - 给 UIViewController 变量分配了多少内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46574922/

相关文章:

ios - Quickblox iOS : chatRoomDidEnter called multiple times

iphone - 如何将 Interface Builder 文档版本控制默认设置为 4.2?

iphone - iOS 乐谱和播放的最佳 API

ios - 移至可见第二个选项卡的分段 View

swift - swift 闭包中的 self 引用在一段时间内返回 nil

objective-c - 使用 ABAddressBook 进行内存管理

iphone - ios mobileshop 帮助资源

swift - Twitter 回调 URL

c# - 如何在.NET中处理COM对象的事件时释放所有COM对象

objective-c - iOS自毁单例设计模式