Sobes.tech
Middle

Pode um valor estar no heap e uma referência na pilha? Explique seu ponto de vista.

sobes.tech IA

Resposta da IA

Sim, este é um comportamento padrão.

  • Stack: Armazena variáveis locais e ponteiros (referências) para objetos. O tempo de vida dos dados na stack está ligado ao scope (âmbito) da função ou bloco de código. O acesso aos dados é rápido.
  • Heap: Armazena objetos criados dinamicamente. O tempo de vida dos dados no heap não está ligado ao scope e é gerido pelo mecanismo de gestão de memória (ARC no iOS). O acesso aos dados é mais lento do que na stack.

Quando criamos um objeto de classe em Swift (por exemplo), o próprio objeto é colocado no heap. A variável que declaramos para armazenar esse objeto é, na essência, uma referência (ponteiro) para os dados no heap e é armazenada na stack.

Exemplo em Swift:

// MyObject é uma classe (tipo de referência), criada no heap
class MyObject {
    var name: String
    init(name: String) {
        self.name = name
    }
}

func myFunction() {
    // myObject - variável na stack que armazena a referência
    // a uma instância de MyObject no heap
    let myObject = MyObject(name: "Test")
    // ... uso de myObject ...
} // myObject (referência) é removida da stack ao sair da função
  // A instância de MyObject no heap é destruída pelo ARC quando não há mais referências fortes

De forma semelhante em Objective-C:

// MyObject é uma classe (tipo de referência), criada no heap
@interface MyObject : NSObject
@property (nonatomic, strong) NSString *name;
- (instancetype)initWithName:(NSString *)name;
@end

@implementation MyObject
- (instancetype)initWithName:(NSString *)name {
    self = [super init];
    if (self) {
        _name = name;
    }
    return self;
}
@end

void myFunction() {
    // myObject - variável na stack que armazena a referência
    // a uma instância de MyObject no heap
    MyObject *myObject = [[MyObject alloc] initWithName:@"Test"];
    // ... uso de myObject ...
} // myObject (referência) é removida da stack ao sair da função
  // A instância de MyObject no heap é destruída pelo ARC quando não há mais referências fortes

Em ambos os casos, a variável myObject está na stack, e a própria instância do objeto MyObject está no heap. A variável myObject contém o endereço de memória onde o objeto está no heap.