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