Middle+
Kaip optional saugomas atmintyje Swift?
sobes.tech AI
Atsakymas iš AI
Swift'e Optional yra saugomi atmintyje viena iš dviejų būdų:
-
Neatitinkančių
_ObjectiveCBridgeableprotokolo tipų atveju: Small/Large Optional reprezentacija.- Mažas Optional: Jei reikšmės dydis yra mažesnis arba lygus rodyklės dydžiui, Optional prideda vieną baitą tipo dydžiui, kad saugotų žymeklį (Present/Absent).
- Didelis Optional: Jei reikšmės dydis yra didesnis už rodyklės dydį, Optional naudoja du "įrašus" atmintyje: vieną paties tipo reikšmei (jei ji yra) ir vieną žymekliui. Tai gali būti arba du šalia esantys atminties segmentai, arba, sudėtingesniais atvejais, nuoroda į atmintyje išskirtą reikšmę.
-
Atitinkančių
_ObjectiveCBridgeableprotokolą tipų atveju (pvz., klasės, kai kurios struktūros): Nullable pointer reprezentacija.- Jei tipas yra klasė arba gali būti pateiktas kaip Objective-C rodyklė, Optional naudoja faktą, kad rodyklė gali būti
nil. Tokiu atveju,nilOptional yra nulinė rodyklė, o ne-nilOptional - nuoroda į objektą. Tai efektyviau atminties atžvilgiu, nes nereikalauja papildomo žymeklio.
- Jei tipas yra klasė arba gali būti pateiktas kaip Objective-C rodyklė, Optional naudoja faktą, kad rodyklė gali būti
Galų gale, Optional gali užimti šiek tiek daugiau vietos nei bazinis tipas (Small/Large Optional), arba tiek pat, kiek rodyklė (Nullable Pointer). Konkretus reprezentavimas nustatomas kompiliatoriaus priklausomai nuo tipo ir jo galimybės būti pateiktam kaip nullable rodyklė.
// Pavyzdys: Int nėra `_ObjectiveCBridgeable`, naudoja Small/Large Optional
var maybeInt: Int? = 10 // Gali būti Small Optional
// Pavyzdys: String `_ObjectiveCBridgeable`, gali naudoti Nullable Pointer
var maybeString: String? = "Hello" // Gali būti Nullable Pointer
// Pavyzdys: Protokolas (Any) nėra `_ObjectiveCBridgeable`, naudoja Small/Large Optional
var maybeAny: Any? = 5 // Small/Large Optional