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:
unownednaudojama, kai nuorodų objektas turi tą patį arba ilgesnį gyvenimo ciklą.weaknaudojama, kai nuorodų objektas gali būti deallocuotas anksčiau. - Optional:
unownednėra Optional (jei nėra deklaruota kaipunowned optional).weakvisada yra Optional. - Saugumas: Prieiga prie
unownednuorodos į jau deallocuotą objektą sukels crash. Prieiga prieweaknuorodos grąžinsnil.
Taigi, unowned yra ne-įsigijanti (non-owning) nuoroda, naudojama, kai garantuojama, kad nuorodų objektas egzistuos tol, kol egzistuos objektas su unowned nuoroda.