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