Middle+
Hoe wordt een optional opgeslagen in het geheugen in Swift?
sobes.tech AI
Antwoord van AI
Optioneel in Swift wordt in het geheugen op een van twee manieren opgeslagen:
-
Voor typen die niet voldoen aan het
_ObjectiveCBridgeableprotocol: Kleine/Grote Optionele Representatie.- Kleine Optioneel: Als de grootte van de waarde kleiner of gelijk is aan de grootte van een pointer, voegt Optional één byte toe aan de typegrootte om een vlag (Aanwezig/Afwezig) op te slaan.
- Grote Optioneel: Als de grootte van de waarde groter is dan de grootte van een pointer, gebruikt Optional twee "slots" in het geheugen: één voor de waarde zelf (indien aanwezig) en één voor de aanwezigheid vlag. Dit kunnen twee aangrenzende geheugenblokken zijn of, in complexere gevallen, een verwijzing naar een op de heap toegewezen waarde.
-
Voor typen die voldoen aan het
_ObjectiveCBridgeableprotocol (bijvoorbeeld klassen, sommige structuren): Nullable Pointer Representatie.- Als het type een klasse is of kan worden voorgesteld als een Objective-C pointer, gebruikt Optional het feit dat een pointer
nilkan zijn. In dat geval wordtnilin Optional voorgesteld als een null-pointer, en niet-nilOptional als een pointer naar een object. Dit is geheugen efficiënter omdat er geen extra vlag nodig is.
- Als het type een klasse is of kan worden voorgesteld als een Objective-C pointer, gebruikt Optional het feit dat een pointer
Kortom, Optional kan iets meer ruimte innemen dan het basistype (Kleine/Grote Optioneel), of evenveel als een pointer (Nullable Pointer). De specifieke representatie wordt door de compiler bepaald op basis van het type en de mogelijkheid ervan om als nullable-pointer te worden voorgesteld.
// Voorbeeld: Int is niet `_ObjectiveCBridgeable`, gebruikt Kleine/Grote Optional
var maybeInt: Int? = 10 // Kan Kleine Optional zijn
// Voorbeeld: String `_ObjectiveCBridgeable`, kan Nullable Pointer gebruiken
var maybeString: String? = "Hello" // Kan Nullable Pointer zijn
// Voorbeeld: Protocol (Any) niet `_ObjectiveCBridgeable`, gebruikt Kleine/Grote Optional
var maybeAny: Any? = 5 // Kleine/Grote Optional