Sobes.tech
Middle

Kokia yra unowned nuorodų tipo paskirtis?

sobes.tech AI

Atsakymas iš AI

unowned nuorodos yra būtinos sprendžiant ciklines nuorodas (retain cycles) tarp objektų, kai abu objektai turi stiprią nuorodą vienas į kitą, tačiau vieno jų gyvenimo ciklas yra trumpesnis arba lygus kitam.

unowned naudojama, kai žinoma, kad nuorodų objektas nebus nil viso objekto, kuris turi nuorodą, gyvenimo ciklo metu. Skirtingai nuo weak, prie unowned nuorodos prieigos nėra naudojamas Optional. Jei nuoroda, į kurią nurodo unowned, bus deallocuota anksčiau nei objektas su unowned nuoroda, įvyks crash.

Pavyzdys naudojimo uždarymuose:

class Person {
    let name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) yra inicializuotas")
    }

    deinit {
        print("\(name) yra deinitializuotas")
    }
}

class Apartment {
    let unit: String
    // Naudojame `unowned`, nes žinome, kad
    // Apartment negali egzistuoti be Person
    // (šiame kontekste). Person gali būti `nil`,
    // bet jei Apartment egzistuoja, tada ir Person egzistuoja.
    unowned let tenant: Person

    init(unit: String, tenant: Person) {
        self.unit = unit
        self.tenant = tenant
        print("Apartment \(unit) yra inicializuotas")
    }

    deinit {
        print("Apartment \(unit) yra deinitializuotas")
    }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
// Šiame pavyzdyje, tenant gali būti `nil`, todėl naudojame `unowned`
unit4A = Apartment(unit: "4A", tenant: john!)

john!.apartment = unit4A

// Nutraukiame stipriąsias nuorodas, kad patikrintume deallocaciją
john = nil
unit4A = nil

Šiame pavyzdyje, Person turi stiprią nuorodą į Apartment (var apartment: Apartment?). Apartment galėtų turėti stiprią nuorodą į Person, kas sukurtų ciklą. Tačiau, kadangi šiame kontekste Apartment logiškai negali egzistuoti be Person (kuris jį nuomoja), nuoroda iš Apartment į Person yra padaryta su unowned. Taip, kai nustatome john = nil, Person yra deallocuotas, ir po to (kadangi nėra stiprių nuorodų į Apartment) jis taip pat yra deallocuotas.

Pagrindiniai skirtumai nuo weak:

  • Gyvenimo ciklas: unowned naudojama, kai nuorodų objektas turi tą patį arba ilgesnį gyvenimo ciklą. weak naudojama, kai nuorodų objektas gali būti deallocuotas anksčiau.
  • Optional: unowned nėra Optional (jei nėra deklaruota kaip unowned optional). weak visada yra Optional.
  • Saugumas: Prieiga prie unowned nuorodos į jau deallocuotą objektą sukels crash. Prieiga prie weak nuorodos grąžins nil.

Taigi, unowned yra ne-įsigijanti (non-owning) nuoroda, naudojama, kai garantuojama, kad nuorodų objektas egzistuos tol, kol egzistuos objektas su unowned nuoroda.