Sobes.tech
Junior

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 automaticamente nil.

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.