Ինչու է անհրաժեշտ unowned հղումների տեսակը?
sobes.tech AI
Պատասխան AI-ից
unowned հղումները անհրաժեշտ են ցիկլային հղումների (retain cycles) լուծման համար օբյեկտների միջև, երբ երկու օբյեկտներն ունեն ուժեղ հղում միմյանց, բայց մեկը ունի կարճ կամ հավասար կյանքի ցիկլ մյուսի նկատմամբ:
unowned օգտագործվում է, երբ հայտնի է, որ հղված օբյեկտը չի լինի nil ամբողջ կյանքի ընթացքում, երբ այն օբյեկտը, որը պարունակում է հղումը։ Բացառությամբ weak, unowned-ի դեպքում հղում հասանելի է առանց Optional։ Եթե այն օբյեկտը, որի վրա հղում է, դեալոկատվի նախքան unowned հղումը, տեղի կունենա crash։
Օրինակ օգտագործումը փակման մեջ՝
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("\(name) սկսում է ինիցիալիզացվել")
}
deinit {
print("\(name) վերջանում է դեինիցիալիզացվել")
}
}
class Apartment {
let unit: String
// Օգտագործում ենք `unowned`, քանի որ հայտնի է, որ
// Apartment-ը չի կարող գոյություն ունենալ առանց Person-ի
// (այստեղ): Person-ը կարող է լինել nil,
// բայց եթե Apartment-ը գոյություն ունի, ապա նաև Person-ը։
unowned let tenant: Person
init(unit: String, tenant: Person) {
self.unit = unit
self.tenant = tenant
print("Apartment \(unit) սկսում է ինիցիալիզացվել")
}
deinit {
print("Apartment \(unit) վերջանում է դեինիցիալիզացվել")
}
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
// Այս օրինակով tenant-ը կարող է լինել nil, այդ պատճառով `unowned`
unit4A = Apartment(unit: "4A", tenant: john!)
john!.apartment = unit4A
// Կտրում ենք ուժեղ հղումները՝ ստուգելու համար դեալոկացիան
john = nil
unit4A = nil
Այս օրինակով, Person ունի ուժեղ հղում Apartment-ին (var apartment: Apartment?)։ Apartment-ը կարող է ունենալ ուժեղ հղում Person-ին, ինչը կստեղծի ցիկլ։ Սակայն, քանի որ այս կոնտեքստում Apartment-ը տրամաբանականորեն չի կարող գոյություն ունենալ առանց Person-ի (ովը վարձակալում է), հղումը Apartment-ից դեպի Person կատարվում է unowned-ով։ Այսպիսով, երբ մենք վերականգնում ենք john = nil, Person-ը դեալոկատվում է, և քանի որ ուժեղ հղումներ Apartment-ին չկան, այն նույնպես դեալոկատվում է։
Հիմնական տարբերությունները weak-ի նկատմամբ՝
- Կյանքի ցիկլ:
unownedօգտագործվում է, երբ հղված օբյեկտը ունի նույն կամ երկար կյանք։weakօգտագործվում է, երբ հղված օբյեկտը կարող է վաղաժամ դեալոկատվել։ - Optional:
unownedչի հանդիսանում Optional (բացառությամբunowned optional-ի դեպքում):weakմիշտ Optional է։ - Անվտանգություն: Հասանելիությունը
unownedհղում ունեցող օբյեկտի արդեն դեալոկատված լինելու դեպքում կհանգեցնի crash-ի։ Հասանելիությունըweakհղումներին կվերադարձնիnil։
Այսպիսով, unowned-ը ոչ-իրավական (non-owning) հղում է, որը օգտագործվում է, երբ երաշխավորված է, որ հղված օբյեկտը գոյություն ունի այնքան ժամանակ, քանի դեռ գոյություն ունի unowned հղում ունեցող օբյեկտը։