Middle
V čem spočívá rozdíl mezi sběračem odpadků (garbage collector) a automatickým řízením paměti (ARC)?
sobes.tech AI
Odpověď od AI
Sběrač odpadu automaticky najde a uvolní paměť, kterou již program nepoužívá. Funguje na pozadí, periodicky prohledává haldu a identifikuje objekty, na které již nejsou aktivní odkazy.
ARC (Automatické počítání odkazů) v Swift a Objective-C spravuje životnost objektů tím, že počítá počet silných odkazů na každý objekt. Jakmile počet silných odkazů na objekt klesne na nulu, ARC automaticky uvolní paměť obsazenou tímto objektem.
Hlavní rozdíly:
| Vlastnost | Sběrač odpadu | ARC |
|---|---|---|
| Princip fungování | Vyhledávání nedostupných objektů | Počítání silných odkazů |
| Moment uvolnění | Nedefinovaný, při skenování | Deterministický, při 0 odkazech |
| Dodatečné náklady | Pauzy při běhu programu (při sběru) | Minimální, při změně počítadla |
| Předvídatelnost | Nízká | Vysoká |
| Cyklické odkazy | Vyžadují speciální přístupy (například slabé odkazy) | Vyžadují použití weak nebo unowned odkazů |
| Použití v iOS | Chybí v moderním Objective-C a Swift | Hlavní mechanismus správy paměti v Objective-C a Swift |
Příklad použití weak k prevenci cyklů silných odkazů v ARC:
class Person {
let jméno: String
var byt: Apartment? // silný odkaz
init(jméno: String) {
self.jméno = jméno
print("\(jméno) je inicializováno")
}
deinit {
print("\(jméno) je deinitializováno")
}
}
class Apartment {
let jednotka: String
weak var nájemník: Person? // slabý odkaz
init(jednotka: String) {
self.jednotka = jednotka
print("Byt \(jednotka) je inicializován")
}
deinit {
print("Byt \(jednotka) je deinitializován")
}
}
var john: Person?
var jednotka4A: Apartment?
john = Person(jméno: "John Appleseed")
jednotka4A = Apartment(jednotka: "4A")
john!.byt = jednotka4A
jednotka4A!.nájemník = john // slabý odkaz zabraňuje cyklu
john = nil // Objekt Person je deinitializován
jednotka4A = nil // Objekt Apartment je deinitializován