Sobes.tech
Junior — Middle

Poderia dar exemplos de situações em que uma estrutura ou objeto é alocado na memória dinâmica no heap?

sobes.tech IA

Resposta da IA

No iOS, os objetos e estruturas são alocados na memória dinâmica (montículo) nos seguintes casos:

  • Objetos de classes (tipos de referência) são sempre alocados no montículo. Por exemplo, quando cria uma instância de uma classe usando MyClass(), a memória para ela é alocada no montículo.

  • Estruturas (tipos de valor) normalmente são alocadas na pilha, mas se a estrutura contiver uma grande quantidade de dados ou for usada em um contexto que exija armazenamento dinâmico (por exemplo, armazenada numa classe ou numa closure), então podem ser colocadas no montículo.

  • Closures (fechos) que capturam variáveis podem alocar memória no montículo para armazenar essas variáveis.

  • O uso de closures @escaping e outras situações onde o ciclo de vida dos dados excede o contexto da pilha, leva à alocação de memória no montículo.

Exemplo:

class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}

let person = Person(name: "Иван") // objeto alocado no montículo

struct Point {
    var x: Int
    var y: Int
}

var p = Point(x: 10, y: 20) // estrutura geralmente na pilha

// Mas se a estrutura estiver armazenada numa classe:
class Container {
    var point: Point
    init(point: Point) {
        self.point = point
    }
}

let container = Container(point: p) // estrutura dentro de uma classe, na realidade no montículo

Assim, objetos de classes estão sempre no montículo, estruturas geralmente na pilha, mas podem estar no montículo dependendo do contexto de uso.