Middle
Ի՞նչ տեսակների հղումներ կան Swift-ում։
sobes.tech AI
Պատասխան AI-ից
Swift-те երեք հիմնական տեսակի հղումներ կան:
-
Strong Reference (Հզոր հղում):
- Բարձրացնում է օբյեկտի հղումների հաշվիչը:
- Պայմանավորում է օբյեկտի ազատումը, քանի դեռ առնվազն մեկ հզոր հղում կա:
- Դա Swift- ում ըստ նախնական կարգաբերման հղման տեսակն է:
- Կարող է առաջացնել ցիկլային հղումներ:
-
**Weak Reference (Ազատ հղում):
- Չբարձրացնում է հղումների հաշվիչը:
- Իջեցնում է օբյեկտի ազատման հնարավորությունը, եթե այլ հզոր հղումներ չկան:
- Հռչակվում է
weakբառով: - միշտ ընտրովի (
Optional), քանի որ հղվող օբյեկտը կարող է լինելnil: - Օգտագործվում է ցիկլային հղումների կանխարգելման համար:
class Person { let name: String weak var apartment: Apartment? // Ազատ հղում init(name: String) { self.name = name } deinit { print("\(name) ազատվեց") } } class Apartment { let unit: String var tenant: Person? // սովորական հզոր հղում init(unit: String) { self.unit = unit } deinit { print("Բնակարան \(unit) ազատվեց") } } var john: Person? var unit4A: Apartment? john = Person(name: "John Appleseed") unit4A = Apartment(unit: "4A") john!.apartment = unit4A unit4A!.tenant = john // Այստեղ կարող է առաջանալ ցիկլային հղում առանց `weak` // Հղումները զրոյացվում են, օբյեկտները ազատվում են john = nil unit4A = nil -
**Unowned Reference (Անհատական հղում):
- Չբարձրացնում է հղումների հաշվիչը:
- Իջեցնում է օբյեկտի ազատման հնարավորությունը, եթե այլ հզոր հղումներ չկան:
- Հռչակվում է
unownedբառով: - Չի հանդիսանում ընտրովի, ենթադրվում է, որ հղվող օբյեկտը միշտ կլինի, քանի դեռ կա այն պարունակող օրինակ:
- Օգտագործվում է ցիկլային հղումների կանխարգելման համար, երբ մեկ օրինակ միշտ պետք է լինի մյուսի առկայության դեպքում, և չի կարող լինել
nil:
class Customer { let name: String var card: CreditCard? init(name: String) { self.name = name } deinit { print("\(name) ազատվեց") } } class CreditCard { let number: UInt64 unowned let customer: Customer // Անհատական հղում init(number: UInt64, customer: Customer) { self.number = number self.customer = customer } deinit { print("Քարտ #\(number) ազատվեց") } } var john: Customer? = Customer(name: "John Appleseed") john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!) // Եթե ջնջենք հաճախորդին, քարտը, որը հղվում է նրա միջոցով `unowned`, կդառնա անվավեր, բայց ցիկլ չի ստեղծվի: john = nil // Երկու օբյեկտներն էլ ազատվում են
Ընտրությունը weak և unowned միջև կախված է օբյեկտների միջև հարաբերության բնույթից: Օգտագործեք weak, երբ մեկը կարող է գոյություն ունենալ առանց մյուսի (Person առանց Apartment), և unowned, երբ մեկը միշտ պետք է գոյություն ունենա մյուսի առկայության ժամանակ (CreditCard միշտ պատկանում է Customer):