0

Sagen wir, ich habe eine Klasse AnimalWie viel Speicher ist mit UIViewController Variablen zugewiesen

class Animal: NSObject { 
    var name: String = "" 
    var weight: Double = 0 
} 

Meiner Ansicht Controller # 1, ich habe ein Array dieser Objekte:

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] = [ .... ] 
} 

Sind meine Animal Objekte dupliziert, wenn ich sie von VC1 filtere und eine Teilmenge davon an VC2 überlasse? Wenn ich von VC2 zu VC1 zurückgehe (d. H. Den Navigationsstapel knallen lasse), werden die Objekte in mammals freigegeben, wodurch Speicher freigegeben wird?

EDIT: Wird dies jeden Retain-Zyklus jeder Art erstellen?

Antwort

1

In Swift sind Klassen Referenztypen, so dass sie nicht kopiert werden. Array ist eine Struktur, die ein Werttyp ist, so dass sie kopiert werden.

Also während das Array kopiert wird, sind die Animal Objekte darin nicht. Beide Arrays haben Referenzen auf einen einzelnen Satz von Animal Objekten. Wenn Sie eines der Objekte Animal ändern, sehen Sie die Änderung unabhängig davon, auf welches Array Sie zugreifen.

Wenn ViewController2 abgelehnt wird, und solange es keine anderen starken Verweise darauf gibt, wird es wie alle seine Eigenschaften freigegeben. Das mammals Array wird freigegeben. Ob die Animal Objekte darin freigegeben sind oder nicht, hängt davon ab, ob diese Objekte andere starke Referenzen auf sie haben oder nicht.

Es gibt keinen Referenzzyklus, der durch Filtern Ihres Arrays von Animal Objekten verursacht wird.

weiter von dem Swift Buch zu lesen:

Structures and Enumerations Are Value Types

Classes Are Reference Types

Automatic Reference Counting

0

Sie sind absolut sicher etwas wie dies zu tun. Was du duplizieren wirst, ist das Array. Das Array selbst ist ein Werttyp, speichert jedoch Klassentypen oder Verweise auf Ihre Objekte. So werden Werte (Adressen) kopiert, aber diese Adressen verweisen immer noch auf die gleichen Objekte wie im Tier-Array. Nachdem Säugetiere aus dem Speicher entfernt wurden, werden nur ihre Werte entfernt, und Werte sind Adressen für Ihre Objekte, aber KEINE OBJEKTE.

Verwandte Themen