Milleks on vajalik unowned viidete tüüp?
sobes.tech AI
Vastus AI-lt
unowned viited on vajalikud tsükliliste viidete (retain cycles) lahendamiseks objektide vahel, kui mõlemal objektil on tugev viide teisele, kuid ühe elutsükkel on lühem või võrdne teisega.
unowned kasutatakse siis, kui on teada, et viidatud objekt ei muutu nil-ks kogu objekti elutsükli jooksul, mis sisaldab viidet. Erinevalt weak-ist ei kasutata Optional-i unowned-i puhul viite juurdepääsul. Kui objekt, millele unowned viitab, deallocatakse enne objekti, millel on unowned viide, toimub crash.
Näide kasutamisest sulgudes:
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) on alustanud")
}
deinit {
print("\(name) on lõpetanud")
}
}
class Apartment {
let unit: String
// Kasutame `unowned`, kuna on teada, et
// Apartment ei saa eksisteerida ilma Personita
// (selles kontekstis). Person võib olla nil,
// kuid kui Apartment eksisteerib, siis ka Person.
unowned let tenant: Person
init(unit: String, tenant: Person) {
self.unit = unit
self.tenant = tenant
print("Apartment \(unit) on alustanud")
}
deinit {
print("Apartment \(unit) on lõpetanud")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
// Selles näites võib tenant olla nil, seega `unowned`
unit4A = Apartment(unit: "4A", tenant: john!)
john!.apartment = unit4A
// Lõikame tugevad viited, et kontrollida deallocatsiooni
john = nil
unit4A = nil
Selles näites on Person tugev viide Apartment-ile (var apartment: Apartment?). Apartment võib omada tugevat viidet Person-ile, mis tekitab tsükli. Kuid kuna selles kontekstis ei saa Apartment eksisteerida ilma Person-ita (kes seda üürib), tehakse viide Apartment-ist Person-ile unowned. Nii, kui määrame john = nil, deallocatakse Person, ja kuna tugevaid viiteid Apartment-ile ei ole, deallocatakse ka Apartment.
Peamised erinevused weak-iga:
- Elutsükkel:
unownedkasutatakse siis, kui viidatud objektil on sama või pikem elutsükkel.weakkasutatakse siis, kui viidatud objekt võib varem deallocatsioonile minna. - Optional:
unownedei ole Optional (välja arvatud juhul, kui see onunowned optional).weakon alati Optional. - Turvalisus: Juurdepääs
unownedviitele juba dealloc'itud objekti põhjustab crashi. Juurdepääsweakviitele tagastabnil.
Seega, unowned on mitte-omanik (non-owning) viide, mida kasutatakse siis, kui on garanteeritud, et viidatud objekt eksisteerib seni, kuni eksisteerib objekt unowned viitega.