Sobes.tech
Junior — Middle

Ի՞նչ տարբերություն կա Weak և Unowned տեսակի հղումներին հիշողության կառավարման մեջ։

sobes.tech AI

Պատասխան AI-ից

Swift-ում weak և unowned տեսակի հղումները օգտագործվում են հիշողության կառավարման ժամանակ ուժեղ հղումային ցիկլերը (retain cycles) կանխելու համար, բայց տարբեր են իրենց վարքով և կիրառմամբ:

  • Weak (թույլ հղում):

    • Կարող է լինել nil:
    • Դեկլարարվում է որպես ընտրովի տիպ (var delegate: SomeDelegate? weak):
    • Օգտագործվում է, երբ հղումը կարող է դառնալ nil օբյեկտի կյանքի ընթացքում, օրինակ, դելեգատներ:
    • Սիստեմը ավտոմատ կերպով դնում է weak հղումը nil երբ նշված օբյեկտը ազատվում է:
  • Unowned (անհատական):

    • Չի կարող լինել nil (չի ընտրովի տիպ):
    • Օգտագործվում է, երբ հղումը երաշխավորված է գոյություն ունենալու օբյեկտի կյանքի ընթացքում, օրինակ, ծնող-մարդու հարաբերություններում:
    • Եթե նշված օբյեկտը արդեն ազատվել է, փորձը մուտք գործելու հանգեցում է ժամանակային սխալի (crash):

Օրինակ:

class Person {
    var apartment: Apartment?
}

class Apartment {
    unowned let tenant: Person
    init(tenant: Person) {
        self.tenant = tenant
    }
}

// Այստեղ, tenant-ը unowned է, քանի որ բնակարանն առանց վարձուի գոյություն չունի:

class DelegateHolder {
    weak var delegate: SomeDelegate?
}

// Դելեգատը weak է, քանի որ կարող է վաղաժամ ազատվել:

Այսպիսով, weak հարմար է այն հղումների համար, որոնք կարող են դառնալ nil, իսկ unowned — այն հղումների համար, որոնք միշտ պետք է լինեն վավեր օբյեկտի կյանքի ընթացքում։