Gestion de memoria: iOS
Para hablar un poco sobre gestión de memoria
tenemos que tener en cuenta varios conceptos que interactúan de alguna manera
con la memoria principal del dispositivo en ios. El sistema ios se caracteriza
de poseer gran capacidad de almacenamiento de memoria, en su administración
observamos como desarrolla cada actividad para cada proceso y la utilidad que
tienen dichos procesos en la memoria.
La memoria real o principal es en donde son
ejecutados los programas y procesos de una computadora y es el espacio real que
existe en memoria para que se ejecuten los procesos.
De acuerdo con la documentación de Apple, las
dos cuestiones principales en la gestión de memoria son:
· Liberando o
sobrescribir los datos que todavía está en uso. Provoca daños en la memoria.
No liberar
datos que ya no está en uso provoca pérdidas de memoria. Cuando la memoria
asignada no se libera a pesar de que nunca va a volver a usar, se conoce como
pérdida de memoria. Apple Inc. implementa ARC en sus sistemas
operativos, como macOS (OS X ) e iOS. Como ya sabemos el lenguaje de programación
utilizado en Apple es el lenguaje C u Objetive C, estos lenguajes tenían una
gestión de memoria manual, es decir, el programador quitaba o dejaba espacios
de memoria según convenía. Cuando el sistema operativo instanciaba un objeto
nuevo lo que hacía era reservar y ocupar un espacio de memoria. Pero antes,
debíamos tener en cuenta esta manipulación de la memoria, ya que si destruimos
un objeto, debiamos liberar ese espacio en la memoria para no acumular
“basura”. Eso ahora es automático y lo hace Xcode con el ARC, que es un sistema
de gestión de la memoria. Esto optimiza al sistema operativo en un porcentaje
muy elevado.
Xcode fue la herramienta que dio paso a la
gestión de memoria más eficaz con la ayuda implementada de ARC (Automatic
Reference Counting), es una función de gestión de memoria del compilador Clang
que proporciona recuentos de referencia automáticos para los lenguajes de programación
Objective-C y Swift, los cuales veremos un
poco de ellos.
Referencia de conteo manual vs Referencia de conteo automatico |
- strong
- weak
Strong
El sistema se encarga de:
Liberar la memoria cuando los contadores de
punteros strong llegan a 0, además, cualquier puntero weak automáticamente se
cambia a nil para evitar el cuelgue de nuestro programa al acceder a un lugar
de la memoria que ya no apunta a un objeto.
Los punteros strong indican la propiedad del
objeto:
•Cuando voy a crear un objeto pienso:
"este objeto es mío entonces es strong".
•En caso de duda usar siempre strong.
•Muchísimo cuidado con crear un objeto que
solo te pertenece a ti como weak. Tras crearlo instantáneamente desaparecerá de
la memoria y el puntero será nil.
Weak
Para prevenir este problema cuando un objeto
no nos pertenece y sabemos que vamos a crear un ciclo utilizamos un puntero
weak.
Cuando el objeto desaparezca de la memoria
nuestro puntero weak será puesto a nil y cualquier mensaje enviado a nil
devuelve 0, lo cual no causará problemas catastróficos. Cosa que sí ocurriría
si enviamos un mensaje a un objeto utilizando un puntero que ya no apunta a un
objeto de ese tipo.
En Swift utiliza el conteo automático de
referencias (ARC) para rastrear y administrar el uso de la memoria de su
aplicación. ARC libera automáticamente la memoria utilizada por instancias de
clase cuando esas instancias ya no son necesarias.
Swift también se asegura de que los accesos
múltiples a la misma área de memoria no entren en conflicto, al requerir que el
código que modifica una ubicación en la memoria tenga acceso exclusivo a esa
memoria. Debido a que Swift administra la memoria automáticamente, la mayoría
de las veces no tiene que pensar en acceder a la memoria en absoluto.
Hay tres características del acceso a la
memoria a tener en cuenta en el contexto de un acceso conflictivo: si el acceso
es de lectura o escritura, la duración del acceso y la ubicación en la memoria
a la que se accede. Específicamente, se produce un conflicto si tiene dos
accesos que cumplen con todas las condiciones siguientes:
Al menos uno es un acceso de escritura.
Acceden a la misma ubicación en la memoria.
Sus duraciones se superponen.
La diferencia entre un acceso de lectura y
escritura suele ser obvia: un acceso de escritura cambia la ubicación en la
memoria, pero un acceso de lectura no lo hace. La ubicación en la memoria se
refiere a lo que se está accediendo, por ejemplo, una variable, constante o
propiedad. La duración de un acceso a la memoria es instantánea o de largo
plazo.
¿Cómo es el proceso de gestión de memoria sin implementar la herramienta ARC?
ResponderBorrarUNIX
Como se sabe el ARC (Conteo de referencia automatico) es la practica de retener y liberar informacion segun su estado de uso, esto es a partir de iOS version 5, antes de eso sin la implementacion del ARC era basicamente un recuento de referencia solo que esta vez era manual, es basicamente lo mismo solo que en este caso el usuario era quien daba la orden de retener o conservar informacion pertinente (usando "RETAIN") y liberando la informacion que no se necesitaba (haciendo uso del "RELEASE"), ya que si no se hacia esto la memoria no se liberaba y tendia a cumularse y producia "basura" o "garbage" lo que no gestionaba bien la memoria y haria que procesos que requieran un gran espacio de almacenamiento no se ejecuten de manera correcta, ya con la llegada del ARC el usuario no debia preocuparse por hacer RETAIN o RELEASE.
Borrar