Sobes.tech
Junior

Aký je rozdiel medzi slabými a silnými odkazmi?

sobes.tech AI

Odpoveď od AI

Rozdiel v mechanizme správy pamäte (ARC - Automatické počítanie odkazov).

  • Silné odkazy (Strong reference): Zvyšujú čítač odkazov objektu o 1. Objekt nemôže byť uvoľnený z pamäte, kým existuje aspoň jedna silná referencia naň. Toto správanie je predvolené pre vlastnosti a premenné v Swift.

  • Slabé odkazy (Weak reference): Nezvyšujú čítač odkazov objektu. Používajú sa na prevenciu cyklických odkazov, keď dva alebo viac objektov majú silné odkazy na seba, čo spôsobuje únik pamäte. Slabé odkazy sú vždy voliteľné (Optional), pretože odkazovaný objekt môže byť kedykoľvek uvoľnený. Ak je objekt uvoľnený, slabý odkaz sa automaticky stáva nil.

Príklad cyklického odkazu a jeho prevencie pomocou slabého odkazu:

class Person {
    let name: String
    var apartment: Apartment? // Pôvodne silný odkaz
    init(name: String) { self.name = name }
    deinit { print("\(name) sa uvoľňuje") }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // Slabý odkaz
    init(unit: String) { self.unit = unit }
    deinit { print("Byt \(unit) sa uvoľňuje") }
}

var john: Person? // Inštancia osoby
var unit4A: Apartment? // Inštancia bytu

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

// Vytvorenie cyklického silného odkazu:
// john má silný odkaz na byt
// byt má silný odkaz na osobu
john!.apartment = unit4A
unit4A!.tenant = john // Toto musí byť slabé, aby sa prerušil cyklus

john = nil // Nastavenie na nil ho neodstráni, ak cyklus existuje
unit4A = nil // Nastavenie na nil ho neodstráni, ak cyklus existuje

// Očakávaný výstup pri použití slabého odkazu pre nájomcu:
// John Appleseed sa uvoľňuje
// Byt 4A sa uvoľňuje

Bez weak pre tenant, by destruktory neboli volané, čo naznačuje únik pamäte.