Sobes.tech
Middle

Jak se ukládají pohledy, které jsou typem odkazu?

sobes.tech AI

Odpověď od AI

Vues (UIView a její podtřídy) v iOS jsou třídy, a tedy odkazové typy. Uložení odkazů na ně se provádí pomocí následujících mechanismů:

  1. Silné odkazy (Strong References):

    • Výchozí, pokud deklarujete vlastnost pro UIView bez specifikátoru weak nebo unowned, vytváří to silný odkaz.
    • Silný odkaz zvyšuje čítač odkazů objektu. Objekt nebude odstraněn z paměti, dokud na něj existuje alespoň jeden silný odkaz.
    • Toto je standardní způsob ukládání views, když je požadováno, aby zůstaly v paměti a byly dostupné.
    //Silný odkaz
    var myView: UIView = UIView()
    
  2. Slabé odkazy (Weak References):

    • Deklarují se pomocí klíčového slova weak.
    • Slabý odkaz nezvyšuje čítač odkazů objektu.
    • Slabé odkazy nebrání odstranění objektu z paměti, pokud na něj nezůstaly žádné silné odkazy.
    • Používají se k prevenci cyklů silných odkazů, typická situace je vztah rodič-dítě, kde rodič má silný odkaz na dítě, a dítě může mít odkaz na rodiče. V takovém případě by zpětný odkaz na rodiče měl být slabý.
    • Slabé odkazy musí být volitelné (Optional), protože objekt může být odstraněn a odkaz se stane nil.
    weak var parentView: UIView?
    
  3. Neowning odkazy (Unowned References):

    • Deklarují se pomocí klíčového slova unowned.
    • Stejně jako slabé odkazy, nezvyšují čítač odkazů.
    • Rozdíl: na rozdíl od slabých odkazů, neowning odkazy ne jsou volitelné. Předpokládá se, že objekt bude žít alespoň tak dlouho, jak existuje odkaz na něj. Pokud se pokusíte přistoupit k objektu přes unowned odkaz po jeho uvolnění, dojde k pádu aplikace.
    • Používají se, když jste si jisti, že životní cyklus odkazu nepřekročí životní cyklus objektu, na který odkazuje. V kontextu views je to méně běžné než weak.
    //Méně typické pro views, ale možné
    unowned var childView: UIView
    
  4. Pole a kolekce:

    • Uložení odkazů na views v polích (Array), slovnících (Dictionary) nebo množinách (Set) také výchozí způsob vytváří silné odkazy na prvky kolekce.
    var subviews: [UIView] = []
    

Volba mezi silným, slabým nebo neowning odkazem závisí na konkrétním scénáři použití a správě životního cyklu objektů, aby se zabránilo únikům paměti. V SwiftUI jsou koncepty správy životního cyklu views trochu odlišné, ale v kontextu UIKit tyto mechanismy zůstávají hlavním způsobem ukládání odkazů.