Buenas prácticas de administración de memory bajo ARC

Mi pregunta está más enfocada en un escenario de stack de navigation … Tengo una, digamos, vista principal con varias celdas de tabla. Cada una de las celdas navega hacia una nueva vista, empujándola hacia la stack de navigation, cuyo controller de vista almacena datos y subvenciones en varios NSMutableArray y NSArray . El flujo común para la aplicación va y viene del controller de vista principal a otro de los controlleres de vista, un escenario común. Apreciaré algunas recomendaciones con respecto a las operaciones de administración de memory que realizaría en dicho escenario, teniendo en count que estoy bajo ARC:

a) ¿Qué personal de "limpieza" debo realizar? ¿Es recomendable limpiar las matrices cada vez que desaparecen las vistas o sería mejor savelas en caso de que el usuario navegue de nuevo a la vista?

b) Con respecto a los puntos de vista y las subvenciones, ¿debería "silenciarlos" también cuando desaparece la vista? Todos ellos, incluidos los definidos en el file nib , o solo aquellos que creo en el código?

Gracias

Al abrir una de sus vistas de detalle, una buena práctica es liberar la memory. Si en sus controlleres de vista de detalle (y solo allí) tiene references sólidas a los datos (sus collections), se lanzarán automáticamente en pop.

El controller de navigation mantiene una fuerte reference a un controller de vista empujado, y cuando lo hace, nils esa reference. Dado que el único object que guarda fuertes references a su colección es el controller de vista en sí, también se desasignarán al aparecer.

Sin embargo , si los datos de una de sus controlleras de vista de detalle requieren la configuration de time (por ejemplo, la descarga) y el usuario vuelve y retrocede frecuentemente a esa misma vista, entonces una buena práctica es savelo en la memory. Para lograrlo, mantenga una fuerte reference al controller de vista de detalle en su controller de vista principal (el controller de vista de tabla). Asegúrese de que solo cree el controller de vista pesado una vez y siempre presione la misma instancia.

Si mantiene una fuerte reference a un controller de vista de detalles pesados ​​para que la aplicación sea más rápida, entonces debe ignorar esa reference en - (void)didReceiveMemoryWarning de su controller de vista de tabla maestra. La memory se recuperará automáticamente si el controller de vista no se pulsa en la stack. (Solo asegúrese de volver a crear el controller de vista si el usuario desea ingresar nuevamente).

Responda a la pregunta b No, generalmente no invalida sus references. Como se indicó anteriormente, si el controller que posee las matrices está desasignado, liberará automáticamente todas las properties sólidas.

Ejemplo de código en el controller de vista de tabla principal si desea mantener los controles de vista pesado:

 // MainTableViewController.m #import "MainTableViewController.h" @interface MainTableViewController() @property (nonatomic, strong) UIViewController *myHeavyViewController; @end @implementation MainTableViewController - (UIViewController *)myHeavyViewController { // // A getter for the strong myHeavyViewController property. Creates the // view controller if needed, or returns it if it already exists. // if (!_myHeavyViewController) { self.myHeavyViewController = ... // Create everything needed } return _myHeavyViewController; } - (void)didReceiveMemoryWarning { // // Nil property if we get a memory warning // self.myHeavyViewController = nil; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath == /* Index path for the heavy view controller */) { // // self.myHeavyViewController always calls the getter above // [self.navigationController pushViewController:self.myHeavyViewController animated:YES]; } } @end