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ń.