Sobes.tech
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:

  1. 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.
  2. 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, nil u Optional je predstavljen kao nulti pokazivač, a non-nil` Optional kao pokazivač na objekat. Ovo je efikasnije u memoriji, jer ne zahteva dodatnu zastavicu.

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