Sobes.tech
Middle+

Como é que um optional é armazenado na memória em Swift?

sobes.tech IA

Resposta da IA

Opcional em Swift é armazenado na memória de uma de duas maneiras:

  1. Para tipos que não cumprem o protocolo _ObjectiveCBridgeable: Representação de Opcional Pequeno/Grande.

    • Opcional Pequeno: Se o tamanho do valor for menor ou igual ao tamanho de um ponteiro, o Optional adiciona um byte ao tamanho do tipo para armazenar uma bandeira (Presente/Ausente).
    • Opcional Grande: Se o tamanho do valor for maior que o tamanho de um ponteiro, o Optional usa dois "espaços" na memória: um para o valor em si (se presente) e outro para a bandeira de presença. Isto pode ser dois segmentos de memória contíguos ou, em casos mais complexos, uma referência a um valor alocado no heap.
  2. Para tipos que cumprem o protocolo _ObjectiveCBridgeable (por exemplo, classes, algumas estruturas): Representação de Ponteiro Nulo.

    • Se o tipo for uma classe ou puder ser representado como um ponteiro Objective-C, o Optional usa o fato de que um ponteiro pode ser nil. Neste caso, nil no Optional é representado como um ponteiro nulo, e um Optional não-nil como um ponteiro para um objeto. Isto é mais eficiente em memória, pois não requer uma bandeira adicional.

Resumindo, o Optional pode ocupar um pouco mais de espaço que o tipo base (Opcional Pequeno/Grande), ou o mesmo que um ponteiro (Ponteiro Nulo). A representação específica é determinada pelo compilador com base no tipo e na sua capacidade de ser representado como um ponteiro nullable.

// Exemplo: Int não é _ObjectiveCBridgeable, usa Opcional Pequeno/Grande
var maybeInt: Int? = 10 // Pode ser Opcional Pequeno

// Exemplo: String _ObjectiveCBridgeable, pode usar Ponteiro Nulo
var maybeString: String? = "Hello" // Pode ser Ponteiro Nulo

// Exemplo: Protocolo (Any) não _ObjectiveCBridgeable, usa Opcional Pequeno/Grande
var maybeAny: Any? = 5 // Opcional Pequeno/Grande