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:
-
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 -
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 parnil.
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) - Deklarēta ar vārdu
-
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 ciklalaikā. - Ja objekts, uz kuru norāda
unownedsaite, 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. - Deklarēta ar vārdu
Galvenā atšķirība starp weak un unowned:
weak: objekts var būtnil. Izmantojiet, ja objektu dzīves ilgums nav stingri saistīts (viens var pastāvēt bez otra).unowned: objekts nevar būtnilpē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.