假设我有一个类 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 书:
关于ios - 给 UIViewController 变量分配了多少内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46574922/