Cómo gestionar la memoria para usted ios

Tan poderosa como lo es, el iPhone - e incluso el iPad - están limitados en recursos, y el más crítico de estos recursos para las aplicaciones de iOS es la memoria. Para entender verdaderamente la forma de gestionar la memoria correctamente en su aplicación, es necesario entender cómo funciona la memoria IOS.

Gestión de la memoria

Cada vez que usted (o un objeto de marco) crea un objeto usando Objective-C, se puede asignar memoria para el objeto. Aunque los dispositivos iOS y Mac toda utilizar lo que se conoce como memoria virtual, a diferencia de la Mac, la memoria virtual en IOS se limita a la cantidad real de memoria física. Así que cuando se empieza a escasear la memoria, el Administrador de memoria libera páginas de memoria que contienen el contenido de sólo lectura (como el código).

De esta manera, todo lo que tiene que hacer es cargar los “originales” de nuevo en la memoria cuando se necesitan. En contraste con lo que el Mac, iOS no almacena temporalmente memoria “cambiante” (como datos de objeto) en el disco para liberar espacio y luego leer los datos de nuevo más tarde cuando se necesita. Este estado de cosas limita la cantidad de memoria disponible.

Así como se puede ver, cuando un objeto se realiza utilizando la memoria, es fundamental que la memoria se libera para su uso por otros objetos.

Si la memoria sigue siendo limitada, el sistema también puede enviar notificaciones a la aplicación en ejecución, pidiéndole que liberar memoria adicional. Este es uno de los eventos críticos que todas las aplicaciones deben responder.

En Objective-C, la memoria se gestiona en aplicaciones de iOS por recuento de referencias - mantener el sistema al día sobre si se está utilizando actualmente un objeto. Siga leyendo para conocer todos los detalles.

recuento de referencias

De hecho, la gestión de memoria es simplemente un ejercicio de conteo. Cada objeto tiene su propia cuenta de referencia, o retener el recuento, que es el número de otros objetos que están utilizando actualmente el objeto. Siempre y cuando la cuenta de retención es mayor que cero, el administrador de memoria supone que alguien se preocupa por ese objeto y lo deja solo.

Cuando un objeto de retener la cuenta llega a cero, el administrador de memoria sabe que nadie necesita más y se envía el objeto de una dealloc mensaje, y después de eso, su memoria se devuelve al sistema para ser reutilizado.

Ese proceso parece bastante sencillo, pero ¿cómo la cuenta de retención conseguir incrementa y decrementa? Hasta Xcode 4.2 y iOS 5.0, que tenía que administrar la cuenta de retención en su aplicación. Cuando se crea un objeto a través de alloc o nuevo o a través de una dupdo o muteableCopy mensaje, mantener la cuenta del objeto se establece en 1.

Cuando su aplicación utiliza uno de estos métodos, la propiedad se transfiere al objeto que envió el mensaje - es decir, el objeto se ha conservado y ese objeto que envió el mensaje se convierte en una licencia no exclusiva propietario del objeto. Propiedad aquí significa que el objeto estará allí para usar hasta que sea liberado de forma explícita mediante el envío de un mensaje cuando ya no es necesario.

Antes de Xcode 4.2 y iOS 5.0, si no se crea un objeto por uno de esos métodos, pero que quería ser un propietario, lo que hace seguro de que el objeto se mantuvo alrededor para que pueda utilizar hasta que se hicieron con ella, que era hasta a que envíe una conservar mensaje a aumentar la cuenta de retención, y cuando terminaron, para enviar una lanzamiento mensaje.

Esto fue debido a que el creador del objeto (lo que provocó el recuento que se establece en 1 conservan) puede haber autoreleased él - envió a un objeto un mensaje de liberación que hará que sea liberado más tarde (por lo general la próxima vez que se entra en el bucle de ejecución) .

Esto es útil en situaciones en las que desea renunciar a la propiedad de un objeto, sino evitar la posibilidad de ser desasignado de inmediato (por ejemplo, cuando usted devuelve un objeto a partir de un método). En cualquier caso, que el encargado del mantenimiento de 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 fallos del sistema se produjo debido aplicaciones se quedó sin memoria y fueron cerradas por el sistema. En algunos de estos casos, la aplicación no lo hizo responder a los métodos de advertencia de memoria y gestionar las advertencias de poca memoria.

La mayor parte del tiempo, sin embargo, incluso si la aplicación respondió a las advertencias de poca memoria, se limitaba a lo que podría hacer porque la memoria estaba filtrado. La memoria era realmente disponible porque no se usaban algunos objetos, pero la memoria esos objetos no había sido liberado de nuevo al sistema. Ya no había referencias a estos objetos, por lo que no podía ser puesto en libertad y luego cancelar la asignación y volver a utilizar la memoria.

Los desarrolladores han tenido una serie de formas de gestionar la memoria de forma automática. Uno es recolección de basura, que escanea a través de la memoria y libera los objetos que no tienen punteros a ellos.

La recolección de basura para Objective-C estaba disponible en el Mac, pero la recolección de basura tiene algunos problemas. Se puede poner en marcha y detener sus aplicaciones en el momento más inoportuno, y afecta el rendimiento y la experiencia del usuario, ya que no tiene control, o cualquier idea, cuándo ocurrirá. Nunca se llevó a cabo en IOS y está en desuso empezando con OS X 10.8 (Mountain Lion).

Tener que hacer todo esto de gestión de memoria en su aplicación ha cambiado con las últimas versiones del compilador de Objective-C, que ahora viene con recuento de referencias automático (ARC), el cual está activada por defecto cada vez que se crea un proyecto. ARC hace por usted en el compilador lo que solía tener que hacer por su cuenta. Se ocupa de todos aquellos lanzamientos, autoreleases, y conservars para usted.

Artículos Relacionados