Sobes.tech
Junior — Middle

Μπορούν οι καταστάσεις που σχετίζονται με τη χρήση αδύναμων (unowned) αναφορών να οδηγήσουν σε σφάλμα της εφαρμογής; Δώστε ένα παράδειγμα.

sobes.tech AI

Απάντηση από AI

Ναι, η χρήση αδύναμων (unowned) αναφορών στη Swift μπορεί να οδηγήσει σε κατάρρευση της εφαρμογής εάν το αντικείμενο στο οποίο αναφέρεται η unowned αναφορά έχει ήδη απελευθερωθεί και προσπαθήσετε να αποκτήσετε πρόσβαση σε αυτήν αργότερα.

Οι unowned αναφορές υποθέτουν ότι το αντικείμενο υπάρχει πάντα όσο η αναφορά είναι ζωντανή. Αν δεν ισχύει αυτό, η εφαρμογή θα καταρρεύσει με σφάλμα "EXC_BAD_ACCESS".

Παράδειγμα:

class Person {
    var apartment: Apartment?
}

class Apartment {
    unowned let tenant: Person
    init(tenant: Person) {
        self.tenant = tenant
    }
}

var john: Person? = Person()
john!.apartment = Apartment(tenant: john!)

john = nil // το αντικείμενο Person απελευθερώνεται

// Τώρα το apartment.tenant είναι μια unowned αναφορά σε ένα ήδη απελευθερωμένο αντικείμενο
// Η πρόσβαση σε αυτό θα προκαλέσει κατάρρευση
print(john!.apartment!.tenant) // crash

Για να αποφύγετε τέτοια σφάλματα, πρέπει να βεβαιωθείτε ότι η unowned αναφορά δεν θα χρησιμοποιηθεί μετά την απελευθέρωση του αντικειμένου, ή να χρησιμοποιήσετε weak αναφορές, που γίνονται nil μετά την απελευθέρωση του αντικειμένου.