Sobes.tech
Junior — Middle

Care este diferența dintre referințele de tip Weak și Unowned în gestionarea memoriei?

sobes.tech AI

Răspuns de la AI

În Swift, referințele de tip weak și unowned sunt utilizate pentru a preveni ciclurile de referințe puternice (cicluri de retenție) în gestionarea memoriei, dar diferă în comportament și aplicare.

  • Weak (referință slabă):

    • Poate fi nil.
    • Este declarată ca un tip opțional (var delegate: SomeDelegate? weak).
    • Este utilizată atunci când referința poate deveni nil pe parcursul vieții obiectului, de exemplu, delegați.
    • Sistemul setează automat referința weak la nil atunci când obiectul referențiat este eliberat.
  • Unowned (fără proprietar):

    • Nu poate fi nil (tip non-opțional).
    • Este utilizată atunci când referința există garantat pe durata vieții obiectului, de exemplu, între un părinte și un copil.
    • Dacă obiectul referențiat de unowned a fost deja eliberat, o încercare de acces va duce la o eroare în timpul execuției (crash).

Exemplu:

class Person {
    var apartment: Apartment?
}

class Apartment {
    unowned let tenant: Person
    init(tenant: Person) {
        self.tenant = tenant
    }
}

// Aici, `tenant` este un `unowned`, deoarece un apartament nu poate exista fără un chiriaș.

class DelegateHolder {
    weak var delegate: SomeDelegate?
}

// Delegatul este `weak`, deoarece poate fi eliberat mai devreme.

Prin urmare, weak este potrivit pentru referințe care pot deveni nil, iar unowned pentru referințe care trebuie să fie întotdeauna valide pe durata vieții obiectului.