iOS: problemas de gestión de la memory ARC / Memory con ModalViewControllers

Estoy escribiendo una aplicación (en iOS 5 usando ARC!) Que presenta varios cientos de objects dentro de un UIViewController personalizado que he escrito que un usuario puede desplazarse y seleccionar, cada uno de los cuales se presenta como una image en miniatura que el usuario puede tocar .

Cada uno de estos objects ha asociado una subclass UIViewController especial que maneja la presentación personalizada de la información asociada con ese object. Por ejemplo, puede ser una image que se puede ampliar y ampliar, o simplemente un poco de text que debe formatearse.

Ahora, cada uno de mis objects de image tiene asociada una gran image. Usando la aplicación Instruments para perfilar mi código y ejecutando Activity Monitor, veo que estos ocupan aproximadamente 5-10MB cada uno cuando se carga la subclass UIViewController personalizada y se muestra la image. Esto está bien para algunas imágenes, pero eventualmente mi aplicación ocupa demasiada memory y se cuelga.

He escrito en el método -viewDidUnload subclass -viewDidUnload aparentemente todas las cosas necesarias para decirle a ARC que libere esta memory, pero no se libera ninguna memory hasta que se emitan advertencias, lo que generalmente ocurre cuando la aplicación está a punto de fallar. Un par de veces, me he dado count de que si me UIViewController lo suficiente al umbral pero no lo UIViewController , las subclasss de UIViewController que vi anteriormente son eliminadas de la memory, aunque el método -viewDidUnload no se llama aparentemente (más bien, el post -didReceiveMemoryWarning se envía a mis UIViewControllers personalizados). Sin embargo, la mayoría de las veces, mi aplicación falla cuando se queda sin memory.

Entonces, mi pregunta central es: ¿debería asumir que ARC dispondrá de un object tan pronto como sea posible, o siempre espera hasta que el espacio se vuelva apretado? El comportamiento que deseo es que el controller de vista personalizada y sus datos se eliminen de inmediato, de modo que la memory nunca se convierta en un problema.

No creo que haya references fuertes de los objects a mis controlleres de vista personalizados, y los ejemplifico en mi controller de vista primaria usando este código:

 [self presentViewController:[cObj grabModalViewController] animated:YES completion:nil]; 

donde cObj es una class personalizada con la información del object. grabModalViewController simplemente instancia un object del tipo correcto y devuelve el puntero, por lo que es probable que la reference local al object se elimine en cuanto se complete el método.

Como resultado, espero que cuando llame más tarde

 [self dismissModalViewControllerAnimated:YES]; 

el controller de vista personalizada que solo se indicó que era el controller de vista principal a través de presentedViewController debería borrarse de la memory, pero esto no sucede.

¿Podría ser esto porque tengo references fuertes dentro de mi object controller de vista personalizado?

Básicamente, lo que trato de lograr es evitar tantas advertencias de memory como sea posible al manejar las cosas mejor desde el principio, pero quizás esta no sea la actitud correcta.

Apreciaría cualquier sugerencia y me complace publicar cualquier código que sea útil.

Entonces, mi pregunta central es: ¿debería asumir que ARC dispondrá de un object tan pronto como sea posible, o siempre espera hasta que el espacio se vuelva apretado?

ARC es una tecnología de time de compilation. No sabe nada sobre el montón de memory de time de ejecución. Por lo tanto, no puede esperar para lanzar elementos hasta que el espacio se vuelva apretado. Una respuesta específica a su pregunta es que ARC lanzará cualquier cosa tan pronto como ya no la necesite.