Sobes.tech
Middle

Ի՞նչ տեսակների հղումներ կան Swift-ում։

sobes.tech AI

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

Swift-те երեք հիմնական տեսակի հղումներ կան:

  1. Strong Reference (Հզոր հղում):

    • Բարձրացնում է օբյեկտի հղումների հաշվիչը:
    • Պայմանավորում է օբյեկտի ազատումը, քանի դեռ առնվազն մեկ հզոր հղում կա:
    • Դա Swift- ում ըստ նախնական կարգաբերման հղման տեսակն է:
    • Կարող է առաջացնել ցիկլային հղումներ:
  2. **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
    
  3. **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):