Sobes.tech
Middle

Co oznacza unowned w kontekście Swift?

sobes.tech AI

Odpowiedź od AI

Unowned odnosi się do automatycznego zarządzania pamięcią w Swift (ARC). Referencje unowned są używane do zapobiegania cyklom silnych odniesień, gdy dwa obiekty odwołują się do siebie nawzajem. Referencja unowned nie zwiększa licznika odniesień obiektu. W przeciwieństwie do weak, referencja unowned zawsze oczekuje, że będzie wskazywać na istniejący egzemplarz; jeśli egzemplarz, na który wskazuje referencja unowned, zostanie zwolniony, próba dostępu do niego spowoduje błąd w czasie wykonywania. Używa się jej, gdy cykl życia powiązanego obiektu jest równy lub dłuższy niż cykl życia obiektu zawierającego odwołanie unowned.

Przykład użycia:

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

    init(name: String) {
        self.name = name
        print("\(name) departament jest inicjalizowany")
    }

    deinit {
        print("\(name) departament jest deinitializowany")
    }
}

class Course {
    var name: String
    unowned var department: Department // Referencja unowned

    init(name: String, department: Department) {
        self.name = name
        self.department = department
        print("\(name) kurs jest inicjalizowany")
    }

    deinit {
        print("\(name) kurs jest deinitializowany")
    }
}

var accounting: Department? = Department(name: "Księgowość")
var introToAccounting: Course? = Course(name: "Wprowadzenie do księgowości", department: accounting!)

accounting!.courses.append(introToAccounting!)

accounting = nil // Teraz obiekt Department może zostać zwolniony
introToAccounting = nil // Teraz obiekt Course może zostać zwolniony

W tym przykładzie, Course ma referencję unowned do Department. Ponieważ Course nie może istnieć bez Department (logicznie), a Department zarządza cyklem życia Course przez tablicę courses, użycie unowned jest tutaj odpowiednie. Zapobiega to silnemu cyklowi odniesień między accounting a introToAccounting. Gdy accounting zostaje ustawione na nil, obiekt Department jest zwalniany, a następnie zwalniany jest również obiekt Course, ponieważ nie ma już do niego silnych odniesień.