Middle+
Kako se optional čuva u memoriji u Swift-u?
sobes.tech АИ
Одговор од АИ
Opcional u Swift-u se čuva u memoriji na jedan od dva načina:
-
Za tipove koji ne zadovoljavaju protokol
_ObjectiveCBridgeable: Reprezentacija Malog/Velikog Opcionalnog.- Mali Opcional: Ako je veličina vrednosti manja ili jednaka veličini pokazivača, Optional dodaje jedan bajt na veličinu tipa za skladištenje zastavice (Prisutno/Odsutno).
- Veliki Opcional: Ako je veličina vrednosti veća od veličine pokazivača, Optional koristi dva "slotova" u memoriji: jedan za samu vrednost (ako je prisutna) i jedan za zastavicu prisutnosti. To mogu biti dva susedna segmenta memorije ili, u složenijim slučajevima, referenca na vrednost alociranu na hrpi.
-
Za tipove koji zadovoljavaju protokol
_ObjectiveCBridgeable(npr. klase, neke strukture): Reprezentacija Nullable pokazivača.- Ako je tip klasa ili može biti predstavljen kao pokazivač Objective-C, Optional koristi činjenicu da pokazivač može biti
nil. U tom slučaju,nilu Optional je predstavljen kao nulti pokazivač, anon-nil` Optional kao pokazivač na objekat. Ovo je efikasnije u memoriji, jer ne zahteva dodatnu zastavicu.
- Ako je tip klasa ili može biti predstavljen kao pokazivač Objective-C, Optional koristi činjenicu da pokazivač može biti
Ukratko, Optional može zauzeti ili malo više mesta od osnovnog tipa (Mali/Veliki Optional), ili isto toliko kao pokazivač (Nullable pokazivač). Konkretno predstavljanje određuje kompajler u zavisnosti od tipa i njegove sposobnosti da bude predstavljen kao nullable pokazivač.
// Primer: Int nije `_ObjectiveCBridgeable`, koristi Mali/Veliki Optional
var maybeInt: Int? = 10 // Može biti Mali Optional
// Primer: String `_ObjectiveCBridgeable`, može koristiti Nullable pokazivač
var maybeString: String? = "Hello" // Može biti Nullable pokazivač
// Primer: Protokol (Any) nije `_ObjectiveCBridgeable`, koristi Mali/Veliki Optional
var maybeAny: Any? = 5 // Mali/Veliki Optional