Sobes.tech
Junior — Middle

¿Pueden las situaciones relacionadas con el uso de referencias débiles (no poseídas) causar fallos en la aplicación? Proporcione un ejemplo.

sobes.tech AI

Respuesta de la IA

Sí, el uso de referencias débiles (unowned) en Swift puede provocar que la aplicación falle si el objeto al que hace referencia la referencia no poseída ya ha sido liberado y se intenta acceder a esa referencia más tarde.

Las referencias no poseídas asumen que el objeto existe siempre que la referencia esté viva. Si no es así, la aplicación se bloqueará con un error "EXC_BAD_ACCESS".

Ejemplo:

class Person {
    var apartment: Apartment?
}

class Apartment {
    unowned let tenant: Person
    init(tenant: Person) {
        self.tenant = tenant
    }
}

var john: Person? = Person()
john!.apartment = Apartment(tenant: john!)

john = nil // el objeto Person se libera

// Ahora apartment.tenant es una referencia no poseída a un objeto ya liberado
// Intentar acceder a ella provocará un fallo
print(john!.apartment!.tenant) // error

Para evitar estos fallos, debes asegurarte de que la referencia no poseída no se use después de que el objeto haya sido liberado, o usar referencias weak, que se vuelven nil después de que el objeto se libera.