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:
-
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.
-
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.
-
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 conweakounowned.
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
weakyunowned. - 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