Sobes.tech
Middle

Kokie yra nuorodų tipai Swift?

sobes.tech AI

Atsakymas iš AI

Swift'e yra trys pagrindiniai nuorodų tipai:

  1. Stipri Nuoroda (Strong Reference):

    • Padidina objekto nuorodų skaitiklį.
    • Užkerta kelią objekto deallokacijai, kol yra bent viena stipri nuoroda.
    • Tai numatytasis nuorodų tipas Swift'e.
    • Pagrindinė stiprių nuorodų ciklų priežastis.
  2. Silpna Nuoroda (Weak Reference):

    • Nepadidina nuorodų skaitiklio.
    • Leidžia objekto deallokaciją, jei nėra stiprių nuorodų.
    • Deklaruojama naudojant weak žodį.
    • Visada yra opcionali (Optional), nes nuoroda gali būti nil.
    • Naudojama siekiant išvengti stiprių nuorodų ciklų, kai vienas objektas gali egzistuoti nepriklausomai nuo kito.
    class Person {
        let name: String
        weak var apartment: Apartment? // Silpna nuoroda
        init(name: String) {
            self.name = name
        }
        deinit { print("\(name) deallocated") }
    }
    
    class Apartment {
        let unit: String
        var tenant: Person? // Įprasta stipri nuoroda
        init(unit: String) {
            self.unit = unit
        }
        deinit { print("Apartment \(unit) deallocated") }
    }
    
    var john: Person?
    var unit4A: Apartment?
    
    john = Person(name: "John Appleseed")
    unit4A = Apartment(unit: "4A")
    
    john!.apartment = unit4A
    unit4A!.tenant = john // Čia galėjo susidaryti stiprių nuorodų ciklas be `weak`
    
    // Nuorodos nustatomos į nil, objektai deallokuojami
    john = nil
    unit4A = nil
    
  3. Nepaprasta Nuoroda (Unowned Reference):

    • Nepadidina nuorodų skaitiklio.
    • Leidžia objekto deallokaciją, jei nėra stiprių nuorodų.
    • Deklaruojama naudojant unowned žodį.
    • Nėra opcionali. Laikoma, kad nuoroda visada egzistuos, kol egzistuos objektas, turintis šią nuorodą.
    • Naudojimas, kai objektas visada turi egzistuoti, kol egzistuoja kitas (CreditCard visada priklauso Customer).
    • Jei naudojama su objektu, kuris jau buvo deallokuotas, tai sukels klaidą (crash).
    • Naudojama siekiant išvengti stiprių nuorodų ciklų, kai vienas objektas turi būti visada egzistuojantis, kol kitas egzistuojantis (self nuoroda užklausose).
    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 // Nepaprasta nuoroda
        init(number: UInt64, customer: Customer) {
            self.number = number
            self.customer = customer
        }
        deinit { print("Card #\(number) deallocated") }
    }
    
    var john: Customer? = Customer(name: "John Appleseed")
    john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
    
    // Jei klientas bus nustatytas į nil, korta, kuri jį nurodo su `unowned`,
    // taps nebegaliojanti, bet ciklas nebus sukurtas.
    john = nil // Abu objektai bus deallokuoti
    

Pasirinkimas tarp weak ir unowned priklauso nuo ryšio pobūdžio tarp objektų: naudokite weak, kai vienas objektas gali egzistuoti be kito (Person be Apartment), ir unowned, kai vienas objektas visada turi egzistuoti, kol egzistuoja kitas (CreditCard visada priklauso Customer).