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:
-
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.
-
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,nilno Optional é representado como um ponteiro nulo, e um Optional não-nilcomo um ponteiro para um objeto. Isto é mais eficiente em memória, pois não requer uma bandeira adicional.
- 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
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