¿Cuál es la mejor manera de entender la administración de memoria en el desarrollo de iOS?

No sueltes automáticamente el hilo principal. Eso equivale a una fuga.

Ejecute Construir y analizar religiosamente. Arreglar advertencias.

El analizador estático no detectará todas sus fugas. Las fugas en los instrumentos ni siquiera detectarán todas tus fugas. Use asignaciones de objetos en instrumentos en el dispositivo , ordene por memoria en vivo y preste atención tanto al total como a los bloques individuales. Cualquier objeto que se quede en las transiciones del controlador de vista debe investigarse. Ejecútelo periódicamente y, si es posible, haga que sus evaluadores también lo hagan.

Limpie el caché de URL periódicamente, y definitivamente en advertencias de memoria. En esa nota, maneje las advertencias de memoria. Incluso si no hace nada, deje la función de plantilla en la clase con un llamado a super.

No deje muchas imágenes de alta resolución en la memoria. Tiene relativamente poca RAM en el dispositivo y el sistema operativo lo matará si lo excede en teléfonos más antiguos. Las imágenes fuera de la pantalla deben purgarse de la memoria en vivo.

Cuidado con las bibliotecas de terceros. Las bibliotecas de anuncios en particular pueden ser sumideros de memoria y no tiene acceso a su código para depurar. Use iAds (pero si solo usa uno y asegúrese de no ocultarlo con elementos de la interfaz de usuario) o AdMob.

Los delegados deben ser referencias débiles. Eso significa propiedades con asignar, no retener. Esto se debe a que normalmente los delegados retienen los objetos que les delegan, y si ambos se retienen entre sí, obtendrán lo que se llama un ciclo de retención y ninguno liberará al otro. Boom, dos fugas.

Nombre sus variables de instancia con camelCase y sus locales con under_score. Libere todas las variables de instancia al final de la función a menos que ya se hayan publicado automáticamente cuando las obtenga. Libere todas las variables de instancia, incluso IBOutlets y aquellas con propiedades que especifiquen retención, en dealloc. NUNCA olvides la llamada a Super en Dealloc.

Libere los valores antiguos de variables de instancia o locales con un recuento de retención mayor que cero antes de asignar un nuevo valor Siempre. Si la variable es nula, se comerá el mensaje de lanzamiento, y si no, entonces lo posee, por lo que debe liberarlo.

Cada objeto tiene un “conteo de retención” que aumenta al llamar “retener” y disminuye al llamar a “liberar”. Una vez que el conteo retenido llega a 0, el objeto se libera y la memoria se puede usar para otra cosa.

Puede “liberar automáticamente” objetos. Esto significa que el recuento de retención no se reduce inmediatamente, sino que se reduce la próxima vez que se agota el grupo de liberación automática actual.

Las aplicaciones de iOS tienen un bucle de eventos en el que se ejecuta su código. Después de cada iteración del bucle de eventos, se agota el grupo de liberación automática. Se libera cualquier objeto con un recuento de retención de 0.

Por defecto, los objetos lanzados automáticamente se devuelven por métodos que no comienzan con new, copy, mutableCopy, reta o init. Esto significa que puede usarlos de inmediato, pero si no los retiene, el objeto desaparecerá en la próxima iteración del ciclo de ejecución.

Si no puede liberar los objetos retenidos pero ya no hace referencia a ellos, tendrá una pérdida de memoria, esto puede ser detectado por la herramienta de pérdidas en los instrumentos.

Una estrategia es liberar automáticamente todo lo que devuelven los métodos mencionados anteriormente y almacenar objetos en propiedades de retención (o copiar para cadenas). En el método dealloc de su objeto, establezca todas sus propiedades en nil. Establecer una propiedad de retención / copia en nulo libera el objeto al que apunta actualmente. Siempre que no tenga referencias circulares (se evita al no utilizar las propiedades de retención para los objetos “primarios”, como los delegados), nunca encontrará fugas.

Fui responsable de reducir el uso de memoria en una aplicación relativamente grande durante dos meses. Por lo tanto, me gustaría compartir algunos recursos que me parecieron particularmente útiles.

Doc de Apple:
Gestión avanzada de memoria. Una de las lecturas obligatorias para comprender la gestión de memoria manual de iOS. Estoy de acuerdo en que es bastante largo. Me llevó mucho tiempo leerlo y comprenderlo.
https://developer.apple.com/libr

Videos WWDC de Apple:
Para mí, los videos WWDC son una forma más rápida de entender la administración de memoria de iOS que leer documentos de Apple. Puede acceder a esos videos en el sitio web para desarrolladores de Apple.
WWDC 2013: Solución de problemas de memoria.
WWDC 2012: Memoria de rendimiento de la aplicación iOS
WWDC 2011: rendimiento de iOS en profundidad
WWDC 2010: Análisis avanzado de memoria con instrumentos

Tutoriales en línea:
El blog de Ray Wenderlich . Gestión de la memoria en Objective-C Tutorial.
http://www.raywenderlich.com/265

También es útil comprender cómo usar las herramientas de medición de memoria como Allocations y VM Tracker. Proporcionan una experiencia práctica sobre cómo se asigna la memoria en su aplicación.

Actualizaré esta publicación si termino mi blog sobre administración de memoria.

¡Espero eso ayude!