Middle+
Hogyan tárolódik az opcionális memória Swiftben?
sobes.tech MI
Válasz az MI-től
A Swiftben az opcionális érték két módon tárolódhat a memóriában:
-
Olyan típusok esetén, amelyek nem felelnek meg az
_ObjectiveCBridgeableprotokollnak: Kis/Nagy opcionális reprezentáció.- Kis opcionális: Ha az érték mérete kisebb vagy egyenlő egy mutató méretével, az opcionális hozzáad egy bájtot a típus méretéhez, hogy tárolja a zászlót (Jelenlévő/Nem jelenlévő).
- Nagy opcionális: Ha az érték mérete nagyobb, mint egy mutató mérete, az opcionális két "helyet" használ a memóriában: egyet az érték számára (ha jelen van), és egyet a jelenlét zászló számára. Ez lehet két egymás melletti memória szegmens vagy, összetettebb esetekben, egy hivatkozás a heapen lévő értékre.
-
Olyan típusok esetén, amelyek megfelelnek az
_ObjectiveCBridgeableprotokollnak (pl. osztályok, néhány struktúra): Nullable mutató reprezentáció.- Ha a típus egy osztály vagy Objective-C mutatóként ábrázolható, az opcionális kihasználja azt a tényt, hogy egy mutató
nillehet. Ebben az esetben anilaz opcionálisan null mutatóként van ábrázolva, míg a nem-nilopcionális egy objektumra mutató. Ez memóriahatékonyabb, mivel nem igényel további zászlót.
- Ha a típus egy osztály vagy Objective-C mutatóként ábrázolható, az opcionális kihasználja azt a tényt, hogy egy mutató
Összefoglalva, az opcionális vagy egy kicsit több helyet foglal el, mint az alap típus (Kis/Nagy opcionális), vagy ugyanannyi helyet, mint egy mutató (Nullable mutató). A konkrét reprezentációt a fordító határozza meg a típus és annak nullable mutatóként való ábrázolási képessége alapján.
// Példa: Az Int nem `_ObjectiveCBridgeable`, Kis/Nagy opcionálissal használja
var maybeInt: Int? = 10 // Lehet Kis opcionális
// Példa: A String `_ObjectiveCBridgeable`, használhat Nullable mutatót
var maybeString: String? = "Hello" // Lehet Nullable mutató
// Példa: A protokoll (Any) nem `_ObjectiveCBridgeable`, Kis/Nagy opcionálissal
var maybeAny: Any? = 5 // Kis/Nagy opcionális