Middle+
Kā optional tiek glabāts atmiņā Swift?
sobes.tech AI
Atbilde no AI
Swift opcijas atmiņā glabā vienā no diviem veidiem:
-
Tipiem, kas neatbilst
_ObjectiveCBridgeableprotokolam: Small/Large Optional reprezentācija.- Mazs opcijas: Ja vērtības izmērs ir mazāks vai vienāds ar norādītāja izmēru, Optional pievieno vienu baitu tipa izmēram, lai glabātu zīmi (Present/Absent).
- Liels opcijas: Ja vērtības izmērs ir lielāks par norādītāja izmēru, Optional izmanto divas "vietas" atmiņā: vienu paša tipa vērtībai (ja tā ir) un vienu zīmes glabāšanai. Tas var būt vai nu divi blakus esoši atmiņas segmenti, vai, sarežģītākos gadījumos, atsauce uz heap-uzglabātu vērtību.
-
Tipiem, kas atbilst
_ObjectiveCBridgeableprotokolam (piemēram, klases, dažas struktūras): Nullable Pointer reprezentācija.- Ja tips ir klases vai var tikt attēlots kā Objective-C norāde, Optional izmanto faktu, ka norāde var būt
nil. Šādā gadījumā,nilOptional tiek attēlots kā nulle norāde, bet ne-nilOptional - kā norāde uz objektu. Tas ir efektīvāk atmiņas izmantošanā, jo neprasa papildu zīmi.
- Ja tips ir klases vai var tikt attēlots kā Objective-C norāde, Optional izmanto faktu, ka norāde var būt
Galu galā, Optional var aizņemt mazliet vairāk vietas nekā pamattipa (Small/Large Optional), vai tikpat daudz kā norāde (Nullable Pointer). Konkrēto reprezentāciju nosaka kompilators atkarībā no tipa un tā spējas tikt attēlotam kā nullable norāde.
// Piemērs: Int nav `_ObjectiveCBridgeable`, izmanto Small/Large Optional
var maybeInt: Int? = 10 // Var būt Small Optional
// Piemērs: String `_ObjectiveCBridgeable`, var izmantot Nullable Pointer
var maybeString: String? = "Hello" // Var būt Nullable Pointer
// Piemērs: Protokols (Any) nav `_ObjectiveCBridgeable`, izmanto Small/Large Optional
var maybeAny: Any? = 5 // Small/Large Optional