Junior — Middle
Ποιοι λόγοι καθιστούν τη χρήση του Unowned λιγότερο προτιμητέα σε ορισμένες καταστάσεις;
sobes.tech AI
Απάντηση από AI
Η χρήση του unowned στο iOS (Swift) είναι λιγότερο προτιμότερη σε καταστάσεις όπου υπάρχει ο κίνδυνος το αντικείμενο στο οποίο αναφέρεται με unowned να απελευθερωθεί (deallocated) πριν χρησιμοποιηθεί η αναφορά. Σε αντίθεση με το weak, το unowned δεν είναι προαιρετικό και δεν γίνεται nil όταν το αντικείμενο απελευθερώνεται, επομένως η πρόσβαση σε τέτοια αναφορά μετά την απελευθέρωση θα οδηγήσει σε σφάλμα εκτέλεσης (runtime error).
Λόγοι για αποφυγή του unowned:
- Αν ο κύκλος ζωής του αντικειμένου δεν εγγυάται ότι η αναφορά θα είναι πάντα έγκυρη.
- Σε πολύπλοκες αμοιβαίες αναφορές, όπου η σειρά απελευθέρωσης των αντικειμένων δεν είναι σαφής.
Σε τέτοιες περιπτώσεις, είναι καλύτερο να χρησιμοποιείτε το weak, που γίνεται αυτόματα nil, αποτρέποντας απρόβλεπτες διακοπές.
Παράδειγμα:
class A {
unowned var b: B
init(b: B) { self.b = b }
}
class B {
var a: A?
}
Αν το αντικείμενο B απελευθερωθεί πριν από το A, η πρόσβαση στο b στο A θα προκαλέσει σφάλμα.