Sobes.tech
Junior — Middle

Poți explica conceptul de unowned în contextul gestionării sigure a referințelor în Swift?

sobes.tech AI

Răspuns de la AI

În Swift, unowned este un modificator de referință care indică faptul că referința nu deține obiectul la care face referire, dar se presupune că obiectul va exista în momentul accesului.

Spre deosebire de weak, unowned nu este o referință opțională și nu stochează nil. Dacă obiectul la care face referire unowned a fost deja eliberat, accesarea acestei referințe va duce la o eroare.

unowned este folosit pentru a preveni ciclurile de referințe puternice (retention cycles), atunci când una dintre referințe va exista garantat mai mult timp decât cealaltă.

Exemplu:

class Person {
    let name: String
    var apartment: Apartment?
    init(name: String) { self.name = name }
}

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

let john = Person(name: "John")
let apt = Apartment(unit: "4A", tenant: john)
john.apartment = apt

Aici, Apartment păstrează o referință unowned către Person, deoarece se garantează că Person va exista mai mult timp decât Apartment. Acest lucru previne ciclurile de retenție, dar necesită să fii sigur că tenant nu va fi eliberat înainte de Apartment.