Sobes.tech
Middle

O que é unowned no contexto do Swift?

sobes.tech IA

Resposta da IA

Unowned refere-se à gestão automática de memória em Swift (ARC). As referências unowned são usadas para evitar ciclos de referências fortes quando dois objetos se referenciam mutuamente. Uma referência unowned não aumenta o contador de referências do objeto. Ao contrário de uma referência weak, uma referência unowned espera-se que sempre aponte para uma instância existente; se a instância à qual a referência unowned aponta for liberada, qualquer tentativa de acesso resultará num erro em tempo de execução. É usada quando o ciclo de vida do objeto relacionado coincide ou é maior que o ciclo de vida do objeto que contém a referência unowned.

Exemplo de uso:

class Department {
    var name: String
    var courses: [Course] = []

    init(name: String) {
        self.name = name
        print("\(name) department is being initialized")
    }

    deinit {
        print("\(name) department is being deinitialized")
    }
}

class Course {
    var name: String
    unowned var department: Department // Referência fraca não opcional

    init(name: String, department: Department) {
        self.name = name
        self.department = department
        print("\(name) course is being initialized")
    }

    deinit {
        print("\(name) course is being deinitialized")
    }
}

var accounting: Department? = Department(name: "Accounting")
var introToAccounting: Course? = Course(name: "Introduction to Accounting", department: accounting!)

accounting!.courses.append(introToAccounting!)

accounting = nil // Agora o objeto Department pode ser liberado
introToAccounting = nil // Agora o objeto Course pode ser liberado

Neste exemplo, Course tem uma referência unowned a Department. Como Course não pode existir sem Department (logicamente), e Department gerencia o ciclo de vida de Course através do array courses, o uso de unowned aqui é apropriado. Isso previne um ciclo forte de referências entre accounting e introToAccounting. Quando accounting se torna nil, o objeto Department é liberado, e depois o objeto Course também é liberado, pois não há mais referências fortes a ele.