Tabla de contenido:
Video: ALMACENAMIENTO CASI LLENO | Solución 2025
Tan poderoso como es, el iPhone, e incluso el iPad, tienen recursos limitados, y el más crítico de estos recursos para las aplicaciones iOS es la memoria. realmente entiendo cómo administrar la memoria correctamente en su aplicación, necesita comprender cómo funciona la memoria iOS.
Administración de memoria
Siempre que usted (o un objeto marco) cree un objeto usando Objective-C, usted asigna memoria para el Aunque los dispositivos iOS y Mac usan lo que se conoce como memoria virtual, a diferencia de la Mac, la memoria virtual en iOS está limitada a la cantidad real de memoria física. Por lo tanto, cuando comienza a quedar poca memoria, el Administrador de memoria libera las páginas de memoria que contienen contenido de solo lectura (como el código).
De esta manera, todo lo que tiene que hacer es cargar los "originales" nuevamente en la memoria cuando son necesarios. A diferencia de lo que hace la Mac, iOS no almacena temporalmente la memoria "modificable" (como datos de objeto) en el disco para liberar espacio y Leer los datos más tarde cuando sea necesario. Este estado de cosas limita la cantidad de memoria disponible.
Entonces, como puede ver, cuando un objeto se hace usando la memoria, es crítico que la memoria se libere para que la usen otros objetos.
Si la memoria continúa siendo limitada, el sistema también puede enviar notificaciones a la aplicación en ejecución y pedirle que libere memoria adicional. Este es uno de los eventos críticos a los que todas las aplicaciones deben responder.
En Objective-C, la memoria se gestiona en las aplicaciones de iOS mediante recuento de referencias , lo que mantiene al sistema actualizado sobre si se está utilizando un objeto en la actualidad. Sigue leyendo para conocer todos los detalles.
Recuento de referencias
De hecho, la gestión de memoria es simplemente un ejercicio de contar. Cada objeto tiene su propia cuenta de referencia, o retención de conteo, que es el número de otros objetos que están usando el objeto actualmente. Siempre que el recuento de retención sea mayor que cero, el administrador de memoria supone que alguien se preocupa por ese objeto y lo deja en paz.
Cuando el recuento de retención de un objeto se reduce a cero, el administrador de memoria sabe que ya nadie lo necesita y envía un mensaje dealloc al objeto, y después de eso, su memoria vuelve al sistema para ser reutilizada.
Ese proceso parece bastante sencillo, pero ¿cómo se incrementa y disminuye el conteo de retención? Hasta Xcode 4. 2 y iOS 5. 0, tenías que administrar el conteo retenido en tu aplicación. Cuando se crea un objeto a través de alloc o nuevo oa través de una copia o un mensaje muteableCopy, el recuento de retención del objeto se establece en 1.
Cuando su aplicación utiliza uno de esos métodos, la propiedad se transfiere al objeto que envió el mensaje; es decir, el objeto se ha retenido y el objeto que envió el mensaje se convierte en un propietario no exclusivo del objeto. Propiedad aquí significa que el objeto estará allí para usarse hasta que se libere explícitamente enviándole un mensaje cuando ya no sea necesario.
Antes de Xcode 4. 2 e iOS 5. 0, si no creaste un objeto por uno de esos métodos, pero querías convertirte en propietario, asegúrate de que el objeto permanezca para que lo uses hasta que lo hayas hecho hecho con eso, depende de usted enviar un mensaje de retención para aumentar el conteo retenido, y cuando haya terminado, para enviar un mensaje de liberación.
Esto se debió a que el creador del objeto (que provocó que el recuento de retenciones se establezca en 1) puede haberlo liberado automáticamente; envió a un objeto un mensaje de lanzamiento que lo liberará más tarde (generalmente la próxima vez que se ejecute el ciclo) es ingresado).
Esto es útil en situaciones en las que desea renunciar a la propiedad de un objeto, pero evita la posibilidad de que se desasigne de inmediato (por ejemplo, cuando devuelve un objeto desde un método). En cualquier caso, estaba manteniendo un puntero al objeto para que pueda ser utilizado.
Aunque este enfoque era simple en teoría, era un verdadero dolor de cabeza para los programadores. La gran mayoría de los bloqueos del sistema se produjeron porque las aplicaciones se quedaron sin memoria y el sistema las cerró. En algunos de estos casos, la aplicación no respondía a los métodos de advertencia de memoria y administraba las advertencias de poca memoria.
Sin embargo, la mayoría de las veces, incluso si la aplicación respondía a las advertencias de memoria baja, se limitaba a lo que podía hacer porque la memoria estaba filtrada. La memoria estaba realmente disponible porque algunos objetos no se estaban utilizando, pero la memoria de esos objetos no se había liberado al sistema. Ya no había punteros a estos objetos, por lo que no podían ser liberados y luego desasignados y la memoria reutilizada.
Los desarrolladores han tenido varias formas de administrar la memoria automáticamente. Una es recolección de basura, que escanea la memoria y libera objetos que no tienen punteros.
La recolección de basura para Objective-C estaba disponible en la Mac, pero la recolección de basura tiene algunos problemas. Puede iniciar y pausar sus aplicaciones en el momento más inoportuno, y afecta el rendimiento y la experiencia del usuario porque no tiene control ni idea de cuándo ocurrirá. Nunca se implementó en iOS y está en desuso, comenzando con OS X 10. 8 (Mountain Lion).
Tener que hacer toda esta gestión de memoria en su aplicación ha cambiado con las últimas versiones del compilador Objective-C, que ahora viene con conteo automático de referencias (ARC), que está habilitado por defecto cada vez que crea un proyecto ARC hace por usted en el compilador lo que solía hacer por su cuenta. Maneja todos los lanzamientos, autorreleases y retiene para usted.