Sobes.tech
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 θα προκαλέσει σφάλμα.