Sobes.tech
Junior

Ποια είναι η διαφορά μεταξύ ασθενών και ισχυρών συνδέσμων;

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, οι καταστροφείς δεν θα καλούνταν, κάτι που υποδεικνύει διαρροή μνήμης.