Ποια είναι η διαφορά μεταξύ ασθενών και ισχυρών συνδέσμων;
sobes.tech AI
Απάντηση από AI
Η διαφορά στον μηχανισμό διαχείρισης μνήμης (ARC - Αυτόματη Καταμέτρηση Αναφορών).
-
Ισχυρή αναφορά (Strong reference): Αυξάνει τον μετρητή αναφορών του αντικειμένου κατά 1. Το αντικείμενο δεν μπορεί να απελευθερωθεί από τη μνήμη όσο υπάρχει τουλάχιστον μια ισχυρή αναφορά σε αυτό. Αυτή η συμπεριφορά είναι προεπιλογή για ιδιότητες και μεταβλητές στη Swift.
-
Αδύναμη αναφορά (Weak reference): Δεν αυξάνει τον μετρητή αναφορών του αντικειμένου. Χρησιμοποιείται για την αποτροπή κυκλικών αναφορών, όταν δύο ή περισσότερα αντικείμενα έχουν ισχυρές αναφορές μεταξύ τους, δημιουργώντας διαρροή μνήμης. Οι αδύναμες αναφορές είναι πάντα προαιρετικές (
Optional), επειδή το αντικείμενο στο οποίο αναφέρονται μπορεί να αποδεσμευτεί οποιαδήποτε στιγμή. Όταν το αντικείμενο απελευθερώνεται, η αδύναμη αναφορά γίνεται αυτόματαnil.
Παράδειγμα κυκλικής αναφοράς και πρόληψής της με χρήση αδύναμης αναφοράς:
class Person {
let name: String
var apartment: Apartment? // Αρχική ισχυρή αναφορά
init(name: String) { self.name = name }
deinit { print("\(name) αποδεσμεύεται") }
}
class Apartment {
let unit: String
weak var tenant: Person? // Αδύναμη αναφορά
init(unit: String) { self.unit = unit }
deinit { print("Διαμέρισμα \(unit) αποδεσμεύεται") }
}
var john: Person? // Αντικείμενο Person
var unit4A: Apartment? // Αντικείμενο Apartment
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
// Δημιουργία κυκλικής ισχυρής αναφοράς:
// ο john έχει ισχυρή αναφορά στο διαμέρισμα
// το διαμέρισμα έχει ισχυρή αναφορά στον άνθρωπο
john!.apartment = unit4A
unit4A!.tenant = john // Αυτό πρέπει να είναι αδύναμο για να σπάσει ο κύκλος
john = nil // Ορισμός σε nil δεν θα αποδεσμεύσει αν υπάρχει ο κύκλος
unit4A = nil // Ορισμός σε nil δεν θα αποδεσμεύσει αν υπάρχει ο κύκλος
// Αναμενόμενη έξοδος κατά τη χρήση αδύναμης αναφοράς για τον ενοικιαστή:
// John Appleseed αποδεσμεύεται
// Διαμέρισμα 4A αποδεσμεύεται
Χωρίς weak για το tenant, οι καταστροφείς δεν θα καλούνταν, κάτι που υποδεικνύει διαρροή μνήμης.