Sobes.tech
Junior

Jaký je rozdíl mezi slabými a silnými odkazy?

sobes.tech AI

Odpověď od AI

Rozdíl v mechanismu správy paměti (ARC - Automatické počítání odkazů).

  • Silné odkazy (Strong reference): Zvyšují čítač odkazů objektu o 1. Objekt nemůže být uvolněn z paměti, dokud existuje alespoň jedna silná reference na něj. Toto chování je ve Swiftu výchozí pro vlastnosti a proměnné.

  • Slabé odkazy (Weak reference): Nezvyšují čítač odkazů objektu. Používají se k prevenci cyklických odkazů, když dva nebo více objektů mají silné odkazy na sebe, což způsobuje únik paměti. Slabé odkazy jsou vždy volitelné (Optional), protože odkazovaný objekt může být kdykoli uvolněn. Pokud je objekt uvolněn, slabý odkaz se automaticky stává nil.

Příklad cyklického odkazu a jeho prevence pomocí slabého odkazu:

class Person {
    let name: String
    var apartment: Apartment? // Původně silný odkaz
    init(name: String) { self.name = name }
    deinit { print("\(name) je uvolněn") }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // Slabý odkaz
    init(unit: String) { self.unit = unit }
    deinit { print("Byt \(unit) je uvolněn") }
}

var john: Person? // Instance osoby
var unit4A: Apartment? // Instance bytu

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

// Vytvoření 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í být slabé, aby se cyklus přerušil

john = nil // Nastavení na nil neodstraní, pokud cyklus existuje
unit4A = nil // Nastavení na nil neodstraní, pokud cyklus existuje

// Očekávaný výstup při použití slabého odkazu pro nájemce:
// John Appleseed je uvolněn
// Byt 4A je uvolněn

Bez weak pro tenant by destruktory nebyly volány, což naznačuje únik paměti.