Sobes.tech
Middle

¿Cómo se almacenan las vistas que son un tipo de referencia?

sobes.tech AI

Respuesta de la IA

Las vistas (UIView y sus subclases) en iOS son clases, por lo tanto, tipos de referencia. El almacenamiento de referencias a ellas se realiza mediante los siguientes mecanismos:

  1. Referencias fuertes (Strong References):

    • Por defecto, si declaras una propiedad para UIView sin el especificador weak o unowned, esto crea una referencia fuerte.
    • Una referencia fuerte incrementa el contador de referencias del objeto. El objeto no será eliminado de la memoria mientras exista al menos una referencia fuerte a él.
    • Esta es la forma estándar de almacenar vistas cuando se requiere que permanezcan en memoria y sean accesibles.
    //Referencia fuerte
    var myView: UIView = UIView()
    
  2. Referencias débiles (Weak References):

    • Se declaran usando la palabra clave weak.
    • Una referencia débil no incrementa el contador de referencias del objeto.
    • Las referencias débiles no previenen la eliminación del objeto de la memoria si no quedan referencias fuertes a él.
    • Se usan para prevenir ciclos de referencias fuertes, una situación típica es la relación padre-hijo, donde el padre tiene una referencia fuerte al hijo, y el hijo a veces puede tener una referencia al padre. En este caso, la referencia inversa al padre debe ser débil.
    • Las referencias débiles deben ser opcionales (Optional), ya que el objeto puede ser eliminado y la referencia se volverá nil.
    weak var parentView: UIView?
    
  3. Referencias no poseídas (Unowned References):

    • Se declaran usando la palabra clave unowned.
    • Al igual que las referencias débiles, no incrementan el contador de referencias.
    • Diferencia: a diferencia de las referencias débiles, las referencias no poseídas no son opcionales. Se asume que el objeto vivirá al menos mientras exista la referencia a él. La aplicación se bloqueará si se intenta acceder al objeto mediante una referencia no poseída después de que haya sido liberado.
    • Se usan cuando se está seguro de que el ciclo de vida de la referencia no excede el ciclo de vida del objeto al que apunta. En el contexto de vistas, esto es menos común que weak.
    //Menos típico para vistas, pero posible
    unowned var childView: UIView
    
  4. Arreglos y Colecciones:

    • El almacenamiento de referencias a vistas en arreglos (Array), diccionarios (Dictionary) o conjuntos (Set) también por defecto crea referencias fuertes a los elementos de la colección.
    var subviews: [UIView] = []
    

La elección entre referencia fuerte, débil o no poseída depende del escenario específico de uso y la gestión del ciclo de vida de los objetos para prevenir fugas de memoria. En SwiftUI, los conceptos de gestión del ciclo de vida de las vistas son diferentes, pero en el contexto de UIKit, estos mecanismos siguen siendo la forma principal de almacenamiento de referencias.