2017-10-04 56 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

你完全可以放心做這樣的事。如你所說,將會重複的是陣列。數組本身是一個值類型,但它存儲類對象的類型或引用。所以值(地址)將被複制,但仍然是,這些地址指向動物數組中的相同對象。在將哺乳動物從記憶中移除後,只會刪除其值,並且值是您的對象的地址,而不是對象。