2017-10-04 33 views
0

比方说,我有一个类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中的对象是否已解除分配,释放内存?

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

回答

1

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

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

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

没有参考周期是由过滤Animal对象的数组引起的。

从斯威夫特书延伸阅读:

Structures and Enumerations Are Value Types

Classes Are Reference Types

Automatic Reference Counting

0

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