Σε ποιες περιπτώσεις είναι προτιμότερο να χρησιμοποιείτε 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, επειδή η κάρτα δεν μπορεί να υπάρχει χωρίς τον πελάτη, και ο πελάτης ζει περισσότερο από την κάρτα.