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 μετά την απελευθέρωση του αντικειμένου.