为UIViewController变量分配了多少内存

时间:2017-10-04 22:07:39

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

我们说我有一个班级class Animal: NSObject { var name: String = "" var weight: Double = 0 }

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] = [ .... ]
}

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

Animal

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

过滤您的Animal对象数组不会导致引用周期。

进一步阅读Swift书:

Structures and Enumerations Are Value Types

Classes Are Reference Types

Automatic Reference Counting

答案 1 :(得分:0)

你做这样的事情是完全安全的。正如你所说的那样,重复的是阵列。数组本身是一个值类型,但它存储类对象或对象的引用。因此,值(地址)将被复制,但这些地址仍指向与动物数组中相同的对象。哺乳动物从记忆中移除后,只删除其值,并且值是对象的地址,但不是对象。

相关问题