Sobes.tech
Middle

Qual é a diferença entre o coletor de lixo (garbage collector) e a gestão automática de memória (ARC)?

sobes.tech IA

Resposta da IA

O recolhedor de lixo encontra e liberta automaticamente a memória que já não é utilizada pelo programa. Funciona em segundo plano, escaneando periodicamente o monte e identificando objetos aos quais não há referências ativas.

ARC (Contagem Automática de Referências) em Swift e Objective-C gere a vida dos objetos contando o número de referências fortes a cada um. Assim que o número de referências fortes de um objeto chega a zero, o ARC liberta automaticamente a memória ocupada por esse objeto.

Principais diferenças:

Característica Recolhedor de lixo ARC
Princípio de funcionamento Procura objetos inalcansáveis Contagem de referências fortes
Momento de libertação Não determinista, durante a varredura Determinista, quando o contador chega a 0
Custos adicionais Pausas na execução do programa (durante a recolha) Mínimos, ao alterar o contador
Previsibilidade Baixa Alta
Referências cíclicas Requerem abordagens especiais (por exemplo, referências fracas) Requerem o uso de referências weak ou unowned
Uso em iOS Ausente em Objective-C e Swift modernos Mecanismo principal de gestão de memória em Objective-C e Swift

Exemplo de uso de weak para prevenir ciclos de referências fortes em ARC:

class Person {
    let name: String
    var apartment: Apartment? // referência forte

    init(name: String) {
        self.name = name
        print("\(name) está a ser inicializado")
    }
    deinit {
        print("\(name) está a ser desinicializado")
    }
}

class Apartment {
    let unit: String
    weak var tenant: Person? // referência fraca

    init(unit: String) {
        self.unit = unit
        print("Apartamento \(unit) está a ser inicializado")
    }
    deinit {
        print("Apartamento \(unit) está a ser desinicializado")
    }
}

var john: Person?
var unit4A: Apartment?

john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")

john!.apartment = unit4A
unit4A!.tenant = john // referência fraca previne ciclo de retenção

john = nil // Objeto Person é desinicializado
unit4A = nil // Objeto Apartment é desinicializado