Sobes.tech
Middle+

¿Cómo está estructurada la memoria en iOS?

sobes.tech AI

Respuesta de la IA

iOS utiliza una estructura jerárquica de memoria con varios tipos:

  1. RAM (Memoria de acceso aleatorio):

    • Tipo de memoria rápida y dependiente de energía.
    • Se usa para almacenar aplicaciones activas y datos.
    • Gestionada por el sistema operativo y el mecanismo ARC (Contador de Referencias Automático) para objetos Swift/Objective-C.
    • Cuando la memoria es escasa, el sistema puede cerrar (terminar) las aplicaciones menos activas.
  2. Memoria incorporada (NAND Flash):

    • Más lenta que la RAM, pero no dependiente de energía.
    • Se usa para almacenar el sistema operativo, aplicaciones, datos del usuario (fotos, videos, documentos).
    • Tiene un recurso limitado en número de ciclos de reescritura.
  3. Memoria caché (L1, L2, L3):

    • Memoria muy rápida a nivel de procesador.
    • Se usa para almacenar instrucciones y datos de uso frecuente para acelerar el acceso a la RAM.

ARC (Contador de Referencias Automático)

  • Mecanismo de gestión de memoria en Swift y Objective-C que automáticamente rastrea y gestiona las referencias a objetos.
  • Cada objeto tiene un contador de referencias. Cuando llega a cero, la memoria ocupada por el objeto se libera.
  • Previene fugas de memoria, pero requiere atención al trabajar con ciclos de referencias fuertes (strong reference cycles) que se pueden resolver con weak o unowned.

Memoria Virtual

  • iOS usa memoria virtual, permitiendo que los programas utilicen un espacio de direcciones mayor que la RAM física disponible.
  • Las páginas de memoria pueden ser transferidas entre RAM y el sistema de archivos (aunque en iOS esto es limitado, principalmente mediante la limpieza de páginas no utilizadas, no mediante un intercambio completo en disco como en macOS).
  • Mecanismos como la "memoria comprimida" pueden comprimir páginas en lugar de escribirlas en almacenamiento.

Gestión de Memoria en la Aplicación

  • El desarrollador trabaja principalmente con memoria a través de ARC.
  • Es importante evitar fugas de memoria, usando correctamente weak y unowned.
  • Se debe optimizar el consumo de memoria, por ejemplo, cargando recursos bajo demanda, usando estructuras de datos eficientes y evitando crear objetos en exceso.
  • Herramientas como Xcode Instruments (Allocations, Leaks) se usan para perfilar el consumo de memoria y detectar fugas.

Ejemplo de uso de weak para prevenir ciclos de referencias fuertes:

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

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

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

class Apartment {
    let unit: String
    weak var tenant: Person? // Usar 'weak' aquí

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

    deinit {
        print("Apartment \(unit) is being deinitialized")
    }
}

var john: Person? = Person(name: "John Appleseed")
var unit4A: Apartment? = Apartment(unit: "4A")

john?.apartment = unit4A
unit4A?.tenant = john

// Si tenant fuera fuerte, al poner john y unit4A a nil,
// los objetos Person y Apartment no serían desinitializados
john = nil // se llama deinit para john
unit4A = nil // se llama deinit para unit4A