Sobes.tech
Junior

O que é o modificador de memória weak em Swift?

sobes.tech IA

Resposta da IA

O modificador weak é utilizado para quebrar ciclos de referências fortes entre objetos, quando um objeto tem uma referência forte a outro, e esse por sua vez tem uma referência forte de volta.

Características principais de weak:

  • Não aumenta o contador de referências: O uso de weak não aumenta o número de referências fortes ao objeto.
  • Pode ser nil: A referência fraca é opcional (Optional) e torna-se automaticamente nil quando o objeto ao qual se refere é desinicializado.
  • Usado para pai/filho: Frequentemente aplicado quando um objeto filho tem uma referência ao seu pai para evitar ciclos de referências fortes.
  • Requer ser declarado como var: Como a referência fraca pode tornar-se nil, ela deve ser uma variável (var), não uma constante (let).

Exemplo de uso:

class Person {
    let name: String
    var apartment: Apartment?

    init(name: String) {
        self.name = name
        print("\(name) está sendo inicializado")
    }

    deinit {
        print("\(name) está sendo desinicializado")
    }
}

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

    init(unit: String) {
        self.unit = unit
        print("Apartamento \(unit) está sendo inicializado")
    }

    deinit {
        print("Apartamento \(unit) está sendo desinicializado")
    }
}

Sem weak var tenant: Person? na classe Apartment, haveria um ciclo de referências fortes, e as instâncias de Person e Apartment não seriam desinicializadas quando não tivessem mais referências fortes. Graças a weak, quando a instância de Person é desinicializada, a referência tenant na instância de Apartment torna-se automaticamente nil.