Middle+
Kuidas optional salvestatakse mällu Swiftis?
sobes.tech AI
Vastus AI-lt
Swiftis on Optional mälus ühe kahel viisil:
-
Tipid, mis ei vasta
_ObjectiveCBridgeableprotokollile: Small/Large Optional Representation.- Väike Optional: Kui väärtuse suurus on väiksem või võrdne viitaja suurusega, lisab Optional tüübi suurusele ühe bait, et salvestada lipp (Present/Absent).
- Suur Optional: Kui väärtuse suurus on suurem kui viitaja suurus, kasutab Optional kahte "kohta" mälus: ühe tüübi enda väärtusele (kui see on olemas) ja ühe olemasolu lipule. See võib olla kas kaks kõrval asetsevat mälusegmenti või keerulisematel juhtudel viide heap-ile eraldatud väärtusele.
-
Tipid, mis vastavad
_ObjectiveCBridgeableprotokollile (nt klassid, mõned struktuurid): Nullable Pointer Representation.- Kui tüüp on klass või seda saab esitada Objective-C viitega, kasutab Optional fakti, et viide võib olla
nil. Sel juhul esitataksenilOptionalina nullviidena, mitte-nilOptionalina viitena objekti. See on mälu kasutamise mõttes tõhusam, kuna ei nõua täiendavat lippu.
- Kui tüüp on klass või seda saab esitada Objective-C viitega, kasutab Optional fakti, et viide võib olla
Lõpuks võib Optional võtta või veidi rohkem ruumi kui alus tüüp (Small/Large Optional) või sama palju kui viit (Nullable Pointer). Konkreetne esitlus määratakse kompilaatori poolt sõltuvalt tüübist ja selle võimest olla esitatud nullable-viitena.
// Näide: Int ei ole `_ObjectiveCBridgeable`, kasutab Small/Large Optional
var maybeInt: Int? = 10 // Võib olla Small Optional
// Näide: String `_ObjectiveCBridgeable`, võib kasutada Nullable Pointer
var maybeString: String? = "Hello" // Võib olla Nullable Pointer
// Näide: Protokoll (Any) ei ole `_ObjectiveCBridgeable`, kasutab Small/Large Optional
var maybeAny: Any? = 5 // Small/Large Optional