Sobes.tech
Middle

¿Qué es unowned en el contexto de Swift?

sobes.tech AI

Respuesta de la IA

Unowned se refiere a la gestión automática de memoria en Swift (ARC). Las referencias unowned se utilizan para evitar ciclos de referencias fuertes cuando dos objetos se refieren mutuamente. Una referencia unowned no incrementa el contador de referencias del objeto. A diferencia de una referencia weak, una referencia unowned siempre se espera que apunte a una instancia existente; si la instancia a la que apunta la referencia unowned se libera, el intento de acceder a ella provocará un error en tiempo de ejecución. Se usa cuando el ciclo de vida del objeto relacionado coincide o es mayor que el ciclo de vida del objeto que contiene la referencia unowned.

Ejemplo 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 // Referencia débil no 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 // Ahora el objeto Department puede ser liberado
introToAccounting = nil // Ahora el objeto Course puede ser liberado

En este ejemplo, Course tiene una referencia unowned a Department. Dado que Course no puede existir sin Department (lógicamente), y Department gestiona el ciclo de vida de Course a través del array courses, el uso de unowned aquí es apropiado. Esto previene un ciclo fuerte de referencias entre accounting y introToAccounting. Cuando accounting se vuelve nil, el objeto Department se libera, y luego se libera también el objeto Course, ya que ya no hay referencias fuertes a él.