多少内存分配给UIViewController的变量
问题描述:
比方说,我有一个类Animal
多少内存分配给UIViewController的变量
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] = [ .... ]
}
是我Animal
当我从VC1中过滤它们并将它们的子集传递给VC2时,对象会被复制?当我从VC2返回到VC1时(即弹出导航堆栈),mammals
中的对象是否已解除分配,释放内存?
编辑:这会创建任何类型的任何保留周期?
答
在Swift中,类是引用类型,所以它们不会被复制。 Array
是一个结构,它是一个值类型,因此它们被复制。
因此,当数组被复制时,其中的Animal
对象不是。这两个数组都将引用一组对象Animal
。如果更改Animal
对象之一,则无论您从哪个阵列访问它,都会看到更改。
当ViewController2
被解雇时,只要没有其他强烈的引用,它将被解除分配以及其所有属性。 mammals
数组将被释放。其中的Animal
对象是否被释放取决于这些对象是否有其他强引用。
没有参考周期是由过滤Animal
对象的数组引起的。
从斯威夫特书延伸阅读:
答
你完全可以放心做这样的事。如你所说,将会重复的是阵列。数组本身是一个值类型,但它存储类对象的类型或引用。所以值(地址)将被复制,但仍然是,这些地址指向动物数组中的相同对象。在将哺乳动物从记忆中移除后,只会删除其值,并且值是您的对象的地址,而不是对象。