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ávanil.
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.