Middle
Kādi ir Swift saites?
sobes.tech AI
Atbilde no AI
Swift ir pastāv trīs galvenie atsauces veidi:
-
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.
-
Vājā Atsauce (Weak Reference):
- Nepalielina atsauces skaitītāju.
- Atļauj objekta deallokāciju, ja vairs nav stipro atsauču.
- Deklarē ar
weakatslēgvārdu. - Vienmēr ir opcionala (
Optional), jo atsauce var būtnil. - 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 -
Nepārtraukta Atsauce (Unowned Reference):
- Nepalielina atsauces skaitītāju.
- Atļauj objekta deallokāciju, ja vairs nav stipro atsauču.
- Deklarē ar
unownedatslē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 (
CreditCardvienmēr piederCustomer). - 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,selfsaites 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).