Sobes.tech
Middle

Ինչու է անհրաժեշտ 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 հղում ունեցող օբյեկտը։