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:
-
Erős hivatkozások (Strong References):
- Alapértelmezés szerint, ha egy UIView tulajdonságát
weakvagyunownedmegjelö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() - Alapértelmezés szerint, ha egy UIView tulajdonságát
-
Gyenge hivatkozások (Weak References):
- A
weakkulcsszó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ásnillesz.
weak var parentView: UIView? - A
-
Unowned hivatkozások:
- A
unownedkulcsszó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 - A
-
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 nézetekre mutató hivatkozások tárolása tömbökben (
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.