Sobes.tech
Middle+

Kuidas optional salvestatakse mällu Swiftis?

sobes.tech AI

Vastus AI-lt

Swiftis on Optional mälus ühe kahel viisil:

  1. Tipid, mis ei vasta _ObjectiveCBridgeable protokollile: 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.
  2. Tipid, mis vastavad _ObjectiveCBridgeable protokollile (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 esitatakse nil Optionalina nullviidena, mitte-nil Optionalina viitena objekti. See on mälu kasutamise mõttes tõhusam, kuna ei nõua täiendavat lippu.

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