Middle
Kokie yra nuorodų tipai Swift?
sobes.tech AI
Atsakymas iš AI
Swift'e yra trys pagrindiniai nuorodų tipai:
-
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.
-
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ūtinil. - 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 -
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 (
CreditCardvisada priklausoCustomer). - 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 (
selfnuoroda 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).