Sobes.tech
Junior — Middle

Σε ποιες περιπτώσεις είναι προτιμότερο να χρησιμοποιείτε unowned αντί για weak στη διαχείριση μνήμης;

sobes.tech AI

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

Στη Swift, weak και unowned χρησιμοποιούνται για την αποτροπή κύκλων ισχυρών αναφορών, αλλά εφαρμόζονται σε διαφορετικές περιπτώσεις:

  • Το weak είναι μια προαιρετική αναφορά που γίνεται αυτόματα nil όταν το αντικείμενο στο οποίο αναφέρεται απελευθερώνεται. Χρησιμοποιείται όταν η αναφορά μπορεί να γίνει nil κατά τη διάρκεια ζωής του αντικειμένου.

  • Το unowned είναι μια μη-προαιρετική αναφορά που υποθέτει ότι το αντικείμενο στο οποίο αναφέρεται θα υπάρχει πάντα κατά τη διάρκεια χρήσης αυτής της αναφοράς. Αν το αντικείμενο απελευθερωθεί, η πρόσβαση σε unowned θα προκαλέσει σφάλμα κατά την εκτέλεση.

Προτιμάται η χρήση του unowned όταν:

  • Η αναφορά πρέπει πάντα να δείχνει σε ένα υπάρχον αντικείμενο (π.χ., ένα γονικό αντικείμενο που ζει περισσότερο από το παιδί).
  • Είστε βέβαιοι ότι η διάρκεια ζωής του αντικειμένου στο οποίο αναφέρεστε δεν θα είναι μικρότερη από τη διάρκεια ζωής της αναφοράς.

Παράδειγμα:

class Customer {
    let name: String
    var card: CreditCard?
    init(name: String) {
        self.name = name
    }
}

class CreditCard {
    let number: UInt64
    unowned let customer: Customer
    init(number: UInt64, customer: Customer) {
        self.number = number
        self.customer = customer
    }
}

let john = Customer(name: "John Appleseed")
john.card = CreditCard(number: 1234_5678_9012_3456, customer: john)

Εδώ, το CreditCard έχει μια αναφορά unowned στον Customer, επειδή η κάρτα δεν μπορεί να υπάρχει χωρίς τον πελάτη, και ο πελάτης ζει περισσότερο από την κάρτα.