Sobes.tech
Middle

Kādi saiti veidi pastāv Swift?

sobes.tech AI

Atbilde no AI

Swift ir pastāv trīs galvenie saites veidi klases piemēriem:

  1. Spēcīga saite (Strong Reference):

    • Tas ir noklusējuma saites veids.
    • Spēcīga saite palielina objekta saites skaitītāju.
    • Objekts netiks atbrīvots no atmiņas, kamēr ir vismaz viena spēcīga saite.
    • Galvenais iemesls ir cikliskas spēcīgas saites (strong reference cycles).
    class Person {
        let name: String
        init(name: String) { self.name = name }
        deinit { print("\(name) is being deinitialized") }
    }
    
    var reference1: Person? = Person(name: "John")
    // reference1 tagad ir spēcīga saite, `Person` saites skaitītājs palielinās
    
  2. Vājā saite (Weak Reference):

    • Deklarēta ar vārdu weak.
    • Vāja saite nesamazina objekta saites skaitītāju.
    • Izmanto, lai novērstu strong reference cycles.
    • Vienmēr ir opcionala (Optional), jo saite uz objektu, uz kuru norāda vāja saite, var tikt de-inicializēta jebkurā laikā. De-inicializācijas laikā vāja saite automātiski kļūst par nil.
    class Apartment {
        let unit: String
        weak var tenant: Person? // Vāja saite
        init(unit: String) { self.unit = unit }
        deinit { print("Apartment \(unit) is being deinitialized") }
    }
    
    var john: Person? = Person(name: "John")
    var unit4A: Apartment? = Apartment(unit: "4A")
    
    john?.apartment = unit4A // Ja `Apartment` būtu stipra saite uz `Person`
    unit4A?.tenant = john   // Vāja saite
    
    // Pēc stipro saite atcelšanas, objekti tiks de-inicializēti
    john = nil
    unit4A = nil
    // Izvade: "John is being deinitialized", "Apartment 4A is being deinitialized"
    // Ja `tenant` būtu stipra saite, notiktu atmiņas noplūde (strong cycle)
    
  3. Nepieciešamā saite (Unowned Reference):

    • Deklarēta ar vārdu unowned.
    • Līdzīga vājas saites ar to, ka nesamazina objekta saites skaitītāju.
    • Izmanto, lai novērstu strong reference cycles.
    • Atšķirībā no weak, nav opcionala (Optional) un pieņem, ka objekts, uz kuru norāda, pastāvēs visā dzīves cikla laikā.
    • Ja objekts, uz kuru norāda unowned saite, tiek de-inicializēts pirms saites, notiks izpildes kļūda (runtime error).
    • Piemērots situācijām, kad viens objekts pastāv vienmēr, kamēr pastāv saistīts objekts, bet ne otrādi (piemēram, "vecāks- bērns", kur vecāks pieder bērnam, bet bērns nepieder vecākam stipri).
    class Customer {
        let name: String
        var card: CreditCard?
        init(name: String) { self.name = name }
        deinit { print("\(name) is being deinitialized") }
    }
    
    class CreditCard {
        let number: Int
        unowned let customer: Customer // Nepieciešamā saite
    
        init(number: Int, customer: Customer) {
            self.number = number
            self.customer = customer // Iniciācijas laikā droši
        }
        deinit { print("Card #\(number) is being deinitialized") }
    }
    
    var john: Customer? = Customer(name: "John Doe")
    john?.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
    
    // Atcelst stipro saiti uz Customer
    john = nil
    // Izvade: "John Doe is being deinitialized", "Card #1234567890123456 is being deinitialized"
    // `CreditCard` iekšējā `customer` saite bija derīga, kamēr `customer` pastāvēja.
    // Ja `CreditCard` dzīvos ilgāk par `Customer` un mēs mēģinātu piekļūt `customer` caur `unowned` saiti, notiktu kļūda.
    

Galvenā atšķirība starp weak un unowned:

  • weak: objekts var būt nil. Izmantojiet, ja objektu dzīves ilgums nav stingri saistīts (viens var pastāvēt bez otra).
  • unowned: objekts nevar būt nil pēc inicializācijas. Izmantojiet, ja esat pārliecināts, ka norādītais objekts pastāvēs vismaz līdz brīdim, kad pastāvēs objekts, kas to norāda.