Sobes.tech
Middle

Hogyan tárolják azokat a nézeteket, amelyek hivatkozástípusok?

sobes.tech MI

Válasz az MI-től

Az iOS-ban a nézetek (UIView és leszármazottai) osztályok, tehát referencia típusok. A rájuk mutató hivatkozások tárolása a következő mechanizmusokon keresztül történik:

  1. Erős hivatkozások (Strong References):

    • Alapértelmezés szerint, ha egy UIView tulajdonságát weak vagy unowned megjelölés nélkül deklarálod, akkor erős hivatkozás jön létre.
    • Egy erős hivatkozás növeli az objektum referencia számlálóját. Az objektum nem kerül törlésre a memóriából, amíg legalább egy erős hivatkozás létezik rá.
    • Ez az alapértelmezett módja a nézetek tárolásának, amikor azt szeretnénk, hogy a memóriában maradjanak és elérhetőek legyenek.
    //Erős hivatkozás
    var myView: UIView = UIView()
    
  2. Gyenge hivatkozások (Weak References):

    • A weak kulcsszóval deklarálódnak.
    • Egy gyenge hivatkozás nem növeli az objektum referencia számlálóját.
    • A gyenge hivatkozások nem akadályozzák az objektum memóriából való törlését, ha nincs más erős hivatkozás.
    • Az erős ciklusok elkerülése érdekében használják, tipikus eset a szülő-gyermek kapcsolat, ahol a szülő erős hivatkozással rendelkezik a gyermekre, és a gyermek néha hivatkozhat a szülőre. Ebben az esetben a fordított hivatkozásnak gyengének kell lennie.
    • A gyenge hivatkozások kötelesek opcionálisak (Optional), mivel az objektum törölhető, és a hivatkozás nil lesz.
    weak var parentView: UIView?
    
  3. Unowned hivatkozások:

    • A unowned kulcsszóval deklarálódnak.
    • Mint a gyenge hivatkozások, nem növelik az objektum referencia számlálóját.
    • Különbség: a gyenge hivatkozásokkal ellentétben, az unowned hivatkozások nem opcionálisak. Feltételezik, hogy az objektum legalább addig él, ameddig a hivatkozás létezik rá. Az objektumhoz való hozzáférés azután, hogy az felszabadult, alkalmazás összeomlását okozza.
    • Akkor használják, amikor biztosak abban, hogy a hivatkozás életciklusa nem haladja meg a célelem életciklusát. A nézetek kontextusában ez kevésbé gyakori, mint a weak.
    //Kevésbé tipikus nézetekhez, de lehetséges
    unowned var childView: UIView
    
  4. Tömbök és kollekciók:

    • A nézetekre mutató hivatkozások tárolása tömbökben (Array), szótárakban (Dictionary) vagy halmazokban (Set) szintén alapértelmezés szerint erős hivatkozásokat hoz létre az elemekre.
    var subviews: [UIView] = []
    

A választás az erős, gyenge vagy unowned hivatkozás között a konkrét felhasználási forgatókönyvtől és az objektumok életciklusának kezelésétől függ, hogy elkerüljük a memória szivárgásokat. A SwiftUI-ban a nézetek életciklus-kezelési fogalmai eltérőek, de a UIKit kontextusában ezek a mechanizmusok továbbra is az alapvető módjai a hivatkozások tárolásának.