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.