Τι είναι unowned στο πλαίσιο του Swift;
sobes.tech AI
Απάντηση από AI
Unowned αναφέρεται στη αυτόματη διαχείριση μνήμης στο Swift (ARC). Οι αναφορές unowned χρησιμοποιούνται για την αποφυγή κύκλων ισχυρών αναφορών όταν δύο αντικείμενα αναφέρονται το ένα στο άλλο. Μια αναφορά unowned δεν αυξάνει τον μετρητή αναφορών του αντικειμένου. Σε αντίθεση με μια weak αναφορά, μια αναφορά unowned αναμένεται πάντα να δείχνει σε μια υπάρχουσα περίπτωση· αν η περίπτωση στην οποία δείχνει η αναφορά unowned απελευθερωθεί, η προσπάθεια πρόσβασης σε αυτή θα οδηγήσει σε σφάλμα κατά την εκτέλεση. Χρησιμοποιείται όταν ο κύκλος ζωής του σχετιζόμενου αντικειμένου ταιριάζει ή είναι μεγαλύτερος από τον κύκλο ζωής του αντικειμένου που περιέχει την αναφορά unowned.
Παράδειγμα χρήσης:
class Department {
var name: String
var courses: [Course] = []
init(name: String) {
self.name = name
print("\(name) τμήμα ξεκινά")
}
deinit {
print("\(name) τμήμα τερματίζεται")
}
}
class Course {
var name: String
unowned var department: Department // unowned αναφορά
init(name: String, department: Department) {
self.name = name
self.department = department
print("\(name) μάθημα ξεκινά")
}
deinit {
print("\(name) μάθημα τερματίζεται")
}
}
var accounting: Department? = Department(name: "Λογιστική")
var introToAccounting: Course? = Course(name: "Εισαγωγή στη Λογιστική", department: accounting!)
accounting!.courses.append(introToAccounting!)
accounting = nil // Τώρα το αντικείμενο Department μπορεί να απελευθερωθεί
introToAccounting = nil // Τώρα το αντικείμενο Course μπορεί να απελευθερωθεί
Σε αυτό το παράδειγμα, το Course έχει μια αναφορά unowned στο Department. Δεδομένου ότι το Course δεν μπορεί να υπάρξει χωρίς το Department (λογικά), και το Department διαχειρίζεται τον κύκλο ζωής του Course μέσω του πίνακα courses, η χρήση του unowned εδώ είναι κατάλληλη. Αυτό αποτρέπει έναν ισχυρό κύκλο αναφορών μεταξύ των accounting και introToAccounting. Όταν το accounting γίνεται nil, το αντικείμενο Department απελευθερώνεται, και στη συνέχεια απελευθερώνεται και το αντικείμενο Course, καθώς δεν υπάρχουν πλέον ισχυρές αναφορές σε αυτό.