Kāda ir atšķirība starp vājām un spēcīgām saitēm?
sobes.tech AI
Atbilde no AI
Atmiņas pārvaldības mehānisma atšķirība (ARC - Automātiskā atsauces skaitīšana):
-
Spēcīga atsauce (Strong reference): palielina objekta atsauces skaitu par 1. Objekts nevar tikt atbrīvots no atmiņas, kamēr tam ir vismaz viena spēcīga atsauce. Šī ir noklusējuma uzvedība Swift īpašībām un mainīgajiem:
-
Vāja atsauce (Weak reference): nepalielina objekta atsauces skaitu. Izmanto ciklisko atsauču novēršanai, kad divi vai vairāki objekti ir savstarpēji stipri atsaukti, radot atmiņas noplūdi. Vājas atsauces vienmēr ir opcijas (
Optional), jo atsauce uz objektu var tikt dzēsta jebkurā laikā. Ja objekts ir dzēsts, vājas atsauces automātiski kļūst parnil:
Ciklo atsauču novēršanas piemērs ar vājo atsauci:
class Person {
let name: String
var apartment: Apartment? // sākumā stipra atsauce
init(name: String) { self.name = name }
deinit { print("\(name) tiek atbrīvots") }
}
class Apartment {
let unit: String
weak var tenant: Person? // vāja atsauce
init(unit: String) { self.unit = unit }
deinit { print("Dzīvoklis \(unit) tiek atbrīvots") }
}
var john: Person? // Person objekts
var unit4A: Apartment? // Apartment objekts
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
// Cikla atsauces veidošana:
// john ir stipra atsauce uz dzīvokli
// dzīvoklis ir stipra atsauce uz personu
john!.apartment = unit4A
unit4A!.tenant = john // tas jābūt vājam, lai pārtrauktu ciklu
john = nil // iestatot john uz nil, tas netiks atbrīvots, ja cikls pastāv
unit4A = nil // tas pats, ja cikls pastāv, tas netiks atbrīvots
// Sagaidāmais rezultāts:
// John Appleseed tiek atbrīvots
// Dzīvoklis 4A tiek atbrīvots
Ja weak netiktu izmantots tenant, deinit funkcijas netiktu izsauktas, kas norāda uz atmiņas noplūdi.