Sobes.tech
Junior — Middle

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 automaticamente nil quando l'oggetto a cui si riferisce viene deallocato. Viene usato quando il riferimento può diventare nil durante 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 a unowned causerà 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.