Qual é a diferença entre links fracos e fortes?
sobes.tech IA
Resposta da IA
A diferença no mecanismo de gestão de memória (ARC - Contagem Automática de Referências).
-
Referência forte (Strong reference): Aumenta o contador de referências do objeto em 1. O objeto não pode ser libertado da memória enquanto existir pelo menos uma referência forte a ele. Este comportamento é padrão para propriedades e variáveis em Swift.
-
Referência fraca (Weak reference): Não aumenta o contador de referências do objeto. São usadas para prevenir referências cíclicas, quando dois ou mais objetos têm referências fortes entre si, criando uma fuga de memória. As referências fracas são sempre opcionais (
Optional), porque o objeto ao qual fazem referência pode ser desalocado a qualquer momento. Se o objeto for libertado, a referência fraca torna-se automaticamentenil.
Exemplo de referência cíclica e sua prevenção usando referência fraca:
class Person {
let name: String
var apartment: Apartment? // Referência forte aqui inicialmente
init(name: String) { self.name = name }
deinit { print("\(name) está a ser desalojado") }
}
class Apartment {
let unit: String
weak var tenant: Person? // Referência fraca aqui
init(unit: String) { self.unit = unit }
deinit { print("Apartamento \(unit) está a ser desalojado") }
}
var john: Person? // Instância de Person
var unit4A: Apartment? // Instância de Apartment
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
// Criar um ciclo de referência forte:
// john tem uma referência forte ao apartamento
// o apartamento tem uma referência forte à pessoa
john!.apartment = unit4A
unit4A!.tenant = john // Isto deve ser fraco para quebrar o ciclo
john = nil // Atribuir a nil a john não o desalojará se o ciclo existir
unit4A = nil // Atribuir a nil a unit4A não o desalojará se o ciclo existir
// Saída esperada ao usar referência fraca para tenant:
// John Appleseed está a ser desalojado
// Apartamento 4A está a ser desalojado
Sem weak para tenant, os destrutores não seriam chamados, indicando uma fuga de memória.