Pregunta

¿Cuáles son las mejores prácticas para reutilizar UIViewControllers? En muchas aplicaciones (incluidos los propios ejemplos de Apple: por ejemplo, SQLiteBooks), los UIViewControllers se asignan e inicializan cada vez que se empuja un UIViewController a la pila. Esto aumenta el uso de memoria con cada nuevo controlador, porque los objetos permanecen en la memoria y no se usan nuevamente.

¿Cómo mejorarlo?

¿Fue útil?

Solución

Esto es lo que hago al crear un nuevo controlador de vista y la memoria se libera cuando la vista se elimina de la ventana

MyViewController *mvc = [[[MyViewController alloc] initWithNibName:@"MyView" bundle:nil] autorelease];
[[self navigationController] pushViewController:mvc animated:YES];

Otros consejos

  

Esto aumenta el uso de memoria con   cada nuevo controlador, porque el   los objetos permanecen en la memoria y no son   usado de nuevo.

Sin embargo, debe liberarse cuando se abre la pila, siempre y cuando no tenga algo más aferrado a ella. Compruebe que se están llamando a sus métodos de Dealloc.

Además, si se empuja a la pila, debe mantenerla al menos hasta que salte (lo que sucede automáticamente si sigue los patrones estándar). Por lo tanto, se se usa nuevamente.

Por lo tanto, seguir el patrón estándar ya debería mantener el uso de memoria tan pequeño como sea posible.

¿Realmente tiene un problema de memoria que está tratando de solucionar o es un caso de optimización prematura ? Diría que, a menos que haya un problema de recursos específico, la mejor práctica sería seguir los patrones estándar del controlador de vista.

Coloque un punto de interrupción en la función dealloc de su controlador de vista y asegúrese de que se llame cuando quite el controlador de vista de la ventana. La memoria no debería seguir acumulándose. Si está creando y autorrelegando sus controladores correctamente (como se muestra en LostInitated arriba), la memoria para cada controlador debería liberarse cuando se elimine.

Si ve que no se llama a dealloc, significa que en alguna parte de la aplicación todavía existe una referencia al controlador de vista.

No olvides que un controlador de vista no es tu vista.

Las vistas que posee un controlador de vista pueden descargarse, por lo que los controladores de vista son muy livianos. Si desea mantener la huella realmente ligera, puede anular cualquier otro dato que el controlador haya asignado en viewDidUnload (llamado principalmente cuando hay una advertencia de memoria; sin embargo, es una cosa de 3.0).

Como se señaló, la mayoría de los controladores de vista se desasignarán cuando los deje (devolver), por lo que generalmente no hay ninguno dando vueltas de todos modos. Pero a veces me resulta útil dejar una referencia si quiero volver a abrir esa vista en el mismo estado en que la dejó el usuario (no funciona entre lanzamientos de aplicaciones).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top