Intern
Co je to garbage collector (sběrač odpadu)?
sobes.tech AI
Odpověď od AI
V iOS neexistuje tradiční sběrač odpadu. Místo něj se používá mechanismus Automatického Referenčního Číslování (ARC).
- Automatický mechanismus: ARC automaticky počítá silné odkazy na objekty.
- Uvolnění paměti: Když počet silných odkazů na objekt dosáhne nuly, ARC uvolní přidělenou paměť.
- Prevence úniků paměti: Správné používání silných, slabých a ne vlastněných (unowned) odkazů umožňuje předcházet únikům paměti a cyklům silných odkazů.
Typy odkazů v ARC:
- Silný (strong): Zvyšuje čítač odkazů. Výchozí.
- Slabý (weak): Nezvyšuje čítač odkazů. Automaticky se stává
nilpři deallocaci objektu. Používá se k prevenci cyklů silných odkazů. Je deklarován jako volitelný typ. - Ne vlastněný (unowned): Nezvyšuje čítač odkazů. Je zaručeno, že objekt, na který odkazuje, existuje po celou dobu životnosti ne vlastněného odkazu. Není volitelný. Používá se, když mají dva objekty vzájemně silný vztah, ale jeden z nich má kratší životnost.
Výhody ARC:
- Předvídatelnost: Uvolnění paměti probíhá deterministicky, jakmile objekt již není používán.
- Výkon: Nejsou žádné dodatečné náklady na pozadí sběrače odpadu, které by mohly způsobit pauzy.
- Jednoduchost: Vývojář nemusí ručně spravovat paměť ve většině případů, ale musí pochopit principy počítání odkazů, aby předešel únikům.
Příklad cyklu silných odkazů:
class Person {
let name: String
var apartment: Apartment? // silný odkaz na Apartment
init(name: String) { self.name = name }
deinit { print("\(name) je deinitializován") }
}
class Apartment {
let unit: String
weak var tenant: Person? // slabý odkaz na Person, aby se předešlo cyklu
init(unit: String) { self.unit = unit }
deinit { print("Apartment \(unit) je deinitializován") }
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john // Použití weak je zde kritické
john = nil
unit4A = nil
// Bez weak tenant: Oba john i unit4A by nebyli deinitializováni.
// S weak tenant: Oba john i unit4A jsou správně deinitializováni.