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 — այն հղումների համար, որոնք միշտ պետք է լինեն վավեր օբյեկտի կյանքի ընթացքում։