Sobes.tech
Middle

Was ist unowned im Kontext von Swift?

sobes.tech KI

Antwort von AI

Unowned bezieht sich auf die automatische Speicherverwaltung in Swift (ARC). Unowned-Referenzen werden verwendet, um starke Referenzzyklen zu vermeiden, wenn zwei Objekte sich gegenseitig stark referenzieren. Eine unowned-Referenz erhöht nicht den Referenzzähler des Objekts. Im Gegensatz zu einer weak-Referenz wird erwartet, dass eine unowned-Referenz immer auf eine bestehende Instanz zeigt; wenn die referenzierte Instanz freigegeben wird, führt der Zugriff darauf zu einem Laufzeitfehler. Es wird verwendet, wenn der Lebenszyklus des verbundenen Objekts mit dem des umgebenden Objekts übereinstimmt oder länger ist.

Beispiel:

class Department {
    var name: String
    var courses: [Course] = []

    init(name: String) {
        self.name = name
        print("\(name) Abteilung wird initialisiert")
    }

    deinit {
        print("\(name) Abteilung wird deinitialisiert")
    }
}

class Course {
    var name: String
    unowned var department: Department // Unowned schwache Referenz

    init(name: String, department: Department) {
        self.name = name
        self.department = department
        print("\(name) Kurs wird initialisiert")
    }

    deinit {
        print("\(name) Kurs wird deinitialisiert")
    }
}

var accounting: Department? = Department(name: "Accounting")
var introToAccounting: Course? = Course(name: "Introduction to Accounting", department: accounting!)

accounting!.courses.append(introToAccounting!)

accounting = nil // Jetzt kann das Department-Objekt freigegeben werden
introToAccounting = nil // Jetzt kann das Course-Objekt freigegeben werden

In diesem Beispiel hat Course eine unowned-Referenz auf Department. Da Course ohne Department nicht existieren kann (logisch), und Department den Lebenszyklus von Course über das Array courses verwaltet, ist die Verwendung von unowned hier angemessen. Dies verhindert einen starken Referenzzyklus zwischen accounting und introToAccounting. Wenn accounting auf nil gesetzt wird, wird das Department-Objekt freigegeben, und anschließend wird auch das Course-Objekt freigegeben, da keine starken Referenzen mehr auf es bestehen.