Sobes.tech
Junior — Middle

În ce cazuri este preferabil să folosiți unowned în loc de weak în gestionarea memoriei?

sobes.tech AI

Răspuns de la AI

În Swift, weak și unowned sunt folosite pentru a preveni ciclurile de referințe puternice, dar se aplică în situații diferite:

  • weak este o referință opțională care devine automat nil atunci când obiectul la care face referire este eliberat. Este utilizată atunci când referința poate deveni nil pe parcursul vieții obiectului.

  • unowned este o referință non-opțională care presupune că obiectul la care face referire va exista întotdeauna în timpul utilizării acestei referințe. Dacă obiectul este eliberat, accesarea unowned va cauza o eroare la timpul de execuție.

Se preferă utilizarea unowned atunci când:

  • Referința trebuie să indice întotdeauna către un obiect existent (de exemplu, un obiect părinte care trăiește mai mult decât copilul).
  • Ești sigur că durata de viață a obiectului la care faci referire nu va fi mai scurtă decât durata de viață a referinței.

Exemplu:

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)

Aici, CreditCard are o referință unowned către Customer, deoarece cardul nu poate exista fără client, iar clientul trăiește mai mult decât cardul.