In quali casi è preferibile usare unowned invece di weak nella gestione della memoria?
sobes.tech AI
Risposta dell'AI
In Swift, weak e unowned vengono usati per prevenire cicli di riferimenti forti, ma si applicano in situazioni diverse:
-
weakè un riferimento opzionale che diventa automaticamentenilquando l'oggetto a cui si riferisce viene deallocato. Viene usato quando il riferimento può diventarenildurante la vita dell'oggetto. -
unownedè un riferimento non opzionale che presume che l'oggetto a cui si riferisce esisterà sempre durante l'uso di questa referenza. Se l'oggetto viene deallocato, l'accesso aunownedcauserà un errore in fase di esecuzione.
Si preferisce usare unowned quando:
- Il riferimento deve sempre puntare a un oggetto esistente (ad esempio, un oggetto genitore che vive più a lungo del figlio).
- Si è sicuri che la durata di vita dell'oggetto referenziato non sarà più breve di quella della referenza.
Esempio:
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)
Qui, CreditCard ha una referenza unowned a Customer, perché la carta non può esistere senza il cliente, e il cliente vive più a lungo della carta.