Sobes.tech
Junior

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 automat nil.

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.