Sobes.tech
Junior

Onde são armazenados os tipos de dados em Swift?

sobes.tech IA

Resposta da IA

Os tipos de dados em Swift são armazenados em duas áreas principais de memória: a pilha e o heap.

Pilha

  • Tipos de valor (tipos de valor):
    • struct (estruturas)
    • enum (enumerações)
    • Tipos básicos, como Int, Double, Bool, String (strings curtas podem ser armazenadas diretamente na pilha para otimização)
  • Os dados são armazenados diretamente na pilha na ordem de execução das funções.
  • A alocação e liberação de memória ocorre automaticamente e muito rapidamente (LIFO - Last In, First Out).

Heap

  • Tipos de referência (tipos de referência):
    • class (classes)
    • Funções e closures
    • Objetos (AnyObject)
  • Os objetos em si são armazenados no heap, e na pilha há apenas referências a eles.
  • A alocação e liberação de memória no heap ocorre de forma dinâmica e é gerenciada pelo sistema (Automatic Reference Counting - ARC).
  • O acesso aos dados no heap é indireto, através de um ponteiro.

Características

  • Ao atribuir um tipo de valor, toda a valor é copiada.
  • Ao atribuir um tipo de referência, apenas a referência é copiada, e ambos os objetos apontam para a mesma área de memória no heap.
  • O ARC rastreia o número de referências fortes aos objetos no heap e libera automaticamente a memória quando não há mais referências.
// Exemplo de tipo de valor - armazenado na pilha
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 10, y: 20)
var p2 = p1 // Toda a valor é copiada

p2.x = 30 // p1 não muda
print("p1: \(p1), p2: \(p2)") // Saída: p1: Point(x: 10, y: 20), p2: Point(x: 30, y: 20)

// Exemplo de tipo de referência - armazenado no heap
class Circle {
    var radius: Double

    init(radius: Double) {
        self.radius = radius
    }
}

var c1 = Circle(radius: 5.0)
var c2 = c1 // Apenas a referência é copiada

c2.radius = 10.0 // c1 também muda, pois ambos apontam para o mesmo objeto no heap
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)") // Saída: c1.radius: 10.0, c2.radius: 10.0