Middle+
Jak je uspořádána paměť v iOS?
sobes.tech AI
Odpověď od AI
iOS používá hierarchickou strukturu paměti s několika typy:
-
RAM (Operační Paměť):
- Rychlý, závislý na energii typ paměti.
- Používá se pro ukládání aktivně běžících aplikací a dat.
- Řídí ho operační systém a mechanismus ARC (Automatic Reference Counting) pro objekty Swift/Objective-C.
- Při nedostatku paměti může systém ukončit méně aktivní aplikace.
-
Vestavěná Paměť (NAND Flash):
- Pomalejší než RAM, ale nezávislá na energii.
- Používá se pro ukládání operačního systému, aplikací, uživatelských dat (fotky, videa, dokumenty).
- Má omezený počet přepisovacích cyklů.
-
Cache paměť (L1, L2, L3):
- Velmi rychlá paměť na úrovni procesoru.
- Používá se pro ukládání často používaných instrukcí a dat ke zrychlení přístupu k RAM.
ARC (Automatic Reference Counting)
- Mechanismus správy paměti ve Swift a Objective-C, který automaticky sleduje a spravuje odkazy na objekty.
- Každý objekt má čítač odkazů. Když dosáhne nuly, uvolní se paměť zabraná objektem.
- Předchází únikům paměti, ale vyžaduje pozornost při práci s cyklickými silnými odkazy (
strong reference cycles), které lze řešit pomocíweaknebounownedodkazů.
Virtuální paměť
- iOS používá virtuální paměť, což umožňuje programům používat větší adresní prostor než fyzická dostupná RAM.
- Stránky paměti mohou být přesouvány mezi RAM a souborovým systémem (ačkoliv v iOS je to omezené, hlavně pomocí čištění nepoužívaných stránek, nikoliv plného swapování na disk jako v macOS).
- Mechanismy jako "komprimovaná paměť" mohou komprimovat stránky místo jejich zápisu do úložiště.
Správa paměti v aplikaci
- Vývojář pracuje hlavně s pamětí přes ARC.
- Je důležité se vyvarovat úniků paměti, správně používat
weakaunowned. - Je třeba optimalizovat spotřebu paměti, například načítáním zdrojů na vyžádání, používáním efektivních datových struktur a vyhýbáním se vytváření nadbytečných objektů.
- Nástroje jako Xcode Instruments (Allocations, Leaks) se používají k profilování spotřeby paměti a hledání úniků.
Příklad použití weak k prevenci cyklických silných odkazů:
class Person {
let name: String
var apartment: Apartment?
init(name: String) {
self.name = name
print("Person \(name) is being initialized")
}
deinit {
print("Person \(name) is being deinitialized")
}
}
class Apartment {
let unit: String
weak var tenant: Person? // Použijte 'weak' zde
init(unit: String) {
self.unit = unit
print("Apartment \(unit) is being initialized")
}
deinit {
print("Apartment \(unit) is being deinitialized")
}
}
var john: Person? = Person(name: "John Appleseed")
var unit4A: Apartment? = Apartment(unit: "4A")
john?.apartment = unit4A
unit4A?.tenant = john
// Pokud by tenant byl strong, při uvolnění john a unit4A
// objekty Person a Apartment by nebyly deinitializovány
john = nil // volání deinit pro john
unit4A = nil // volání deinit pro unit4A