Sobes.tech
Middle

Kādi ir Swift saites?

sobes.tech AI

Atbilde no AI

Swift ir pastāv trīs galvenie atsauces veidi:

  1. Stiprā Atsauce (Strong Reference):

    • Palielina objekta atsauces skaitītāju.
    • Novērš objekta deallokāciju, kamēr ir vismaz viena stiprā atsauce.
    • Tā ir noklusējuma atsauces veids Swift.
    • Galvenais stipro atsauču ciklu cēlonis.
  2. Vājā Atsauce (Weak Reference):

    • Nepalielina atsauces skaitītāju.
    • Atļauj objekta deallokāciju, ja vairs nav stipro atsauču.
    • Deklarē ar weak atslēgvārdu.
    • Vienmēr ir opcionala (Optional), jo atsauce var būt nil.
    • Izmanto, lai novērstu stipro atsauču ciklus, kad viens objekts var pastāvēt neatkarīgi no otra.
    class Person {
        let name: String
        weak var apartment: Apartment? // Vāja atsauce
        init(name: String) {
            self.name = name
        }
        deinit { print("\(name) deallocated") }
    }
    
    class Apartment {
        let unit: String
        var tenant: Person? // Parasta stiprā atsauce
        init(unit: String) {
            self.unit = unit
        }
        deinit { print("Dzīvoklis \(unit) deallocated") }
    }
    
    var john: Person?
    var unit4A: Apartment?
    
    john = Person(name: "John Appleseed")
    unit4A = Apartment(unit: "4A")
    
    john!.apartment = unit4A
    unit4A!.tenant = john // Šeit varētu rasties stipro atsauču cikls bez `weak`
    
    // Atsauces tiek nulle, objekti tiek deallokēti
    john = nil
    unit4A = nil
    
  3. Nepārtraukta Atsauce (Unowned Reference):

    • Nepalielina atsauces skaitītāju.
    • Atļauj objekta deallokāciju, ja vairs nav stipro atsauču.
    • Deklarē ar unowned atslēgvārdu.
    • Nav opcionala. Pieņem, ka atsauce vienmēr pastāvēs, kamēr pastāv objekts, kuram tā pieder.
    • Izmanto, ja objekts vienmēr ir jāpastāv, kamēr pastāv cits objekts (CreditCard vienmēr pieder Customer).
    • Ja tiek izmantots ar jau deallokētu objektu, tas izraisīs izņēmumu (crash).
    • Izmanto, lai novērstu stipro atsauču ciklus, kad viens objekts vienmēr ir jāpastāv, kamēr pastāv cits, un nav iespējams, ka viens no tiem kļūst nil (piemēram, self saites slēdžos).
    class Customer {
        let name: String
        var card: CreditCard?
        init(name: String) {
            self.name = name
        }
        deinit { print("\(name) deallocated") }
    }
    
    class CreditCard {
        let number: UInt64
        unowned let customer: Customer // Nepārtraukta saite
        init(number: UInt64, customer: Customer) {
            self.number = number
            self.customer = customer
        }
        deinit { print("Karte #\(number) deallocated") }
    }
    
    var john: Customer? = Customer(name: "John Appleseed")
    john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
    
    // Ja klients tiek nulle, karte, kas to norāda ar `unowned`,
    // kļūs nederīga, bet cikls netiks izveidots.
    john = nil // Abi objekti tiek deallokēti
    

Izvēle starp weak un unowned ir atkarīga no saistības rakstura starp objektiem: izmantojiet weak, kad viens objekts var pastāvēt bez otra (Person bez Apartment), un unowned, kad viens objekts vienmēr ir jāpastāv, kamēr pastāv otrs (CreditCard vienmēr pieder Customer).