我们说我有一个班级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}}中的对象是否已解除分配,释放内存?
编辑:这会创建任何类型的保留周期吗?
答案 0 :(得分:1)
在Swift中,类是引用类型,因此不会复制它们。 Array
是一个结构,它是一个值类型,因此它们被复制。
因此,在复制数组时,其中的Animal
对象不是。两个数组都将引用一组Animal
个对象。如果您更改其中一个Animal
对象,无论您从哪个阵列访问它,都会看到更改。
当ViewController2
被解雇时,只要没有其他强引用,它就会被解除分配,因为它的所有属性都将被释放。将释放mammals
数组。是否释放其中的Animal
个对象取决于这些对象是否具有其他强引用。
过滤您的Animal
对象数组不会导致引用周期。
进一步阅读Swift书:
答案 1 :(得分:0)
你做这样的事情是完全安全的。正如你所说的那样,重复的是阵列。数组本身是一个值类型,但它存储类对象或对象的引用。因此,值(地址)将被复制,但这些地址仍指向与动物数组中相同的对象。哺乳动物从记忆中移除后,只删除其值,并且值是对象的地址,但不是对象。