Care este diferența dintre linkurile slabe și cele puternice?
sobes.tech AI
Răspuns de la AI
Diferența în mecanismul de gestionare a memoriei (ARC - Numărarea automată a referințelor).
-
Referință puternică (Strong reference): Crește contorul de referințe al obiectului cu 1. Obiectul nu poate fi eliberat din memorie atâta timp cât există cel puțin o referință puternică către el. Acest comportament este implicit pentru proprietăți și variabile în Swift.
-
Referință slabă (Weak reference): Nu crește contorul de referințe al obiectului. Se folosește pentru a preveni referințele ciclice, atunci când două sau mai multe obiecte au referințe puternice între ele, creând o scurgere de memorie. Referințele slabe sunt întotdeauna opționale (
Optional), deoarece obiectul la care fac referire poate fi deallocat în orice moment. Dacă obiectul este eliberat, referința slabă devine automatnil.
Exemplu de referință ciclică și prevenirea acesteia cu ajutorul referinței slabe:
class Person {
let name: String
var apartment: Apartment? // Referință puternică inițial
init(name: String) { self.name = name }
deinit { print("\(name) este fiind deinitializat") }
}
class Apartment {
let unit: String
weak var tenant: Person? // Referință slabă
init(unit: String) { self.unit = unit }
deinit { print("Apartament \(unit) este fiind deinitializat") }
}
var john: Person? // Instanță de Person
var unit4A: Apartment? // Instanță de Apartment
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
// Crearea unui ciclu de referință puternică:
// john are o referință puternică la apartament
// apartamentul are o referință puternică la persoană
john!.apartment = unit4A
unit4A!.tenant = john // Acest lucru trebuie să fie slab pentru a întrerupe ciclul
john = nil // Setarea la nil nu va dealloca dacă ciclul există
unit4A = nil // Setarea la nil nu va dealloca dacă ciclul există
// Ieșirea așteptată când se folosește referința slabă pentru chiriaș:
// John Appleseed este fiind deinitializat
// Apartament 4A este fiind deinitializat
Fără weak pentru tenant, destructorii nu ar fi fost chemați, ceea ce indică o scurgere de memorie.