Sobes.tech
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:

  1. 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.
  2. 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ů.
  3. 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í weak nebo unowned odkazů.

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 weak a unowned.
  • 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