2009-01-21 9 views
8

Necesito lecciones sobre administración de memoria. Tengo una aplicación que usa vistas múltiples (alrededor de 10), algunas de estas están asociadas al controlador de pestañas. El problema es que estoy usando imágenes (muchas imágenes que cargo desde un servicio web). Estoy enfrentando los siguientes problemas.Desarrollo de iPhone - Lecciones de administración de memoria

  1. La memoria sigue aumentando cuando me desplazo en la vista de tabla (por qué?) - he comprobado la aplicación CustomTableViewCell desde el sitio de Apple, y se está mostrando las mismas señales cuando lo ejecuto con instrumentos.

  2. Estoy utilizando la liberación automática con muchos objetos, pero veo que estos objetos no se liberan realmente y la memoria está conectada. ¿Cómo puedo deshacerme de estos objetos?

  3. ¿Cómo puedo decirle al NSAutoreleasePool que suelte periódicamente los objetos que no están siendo utilizados? Creo que esto puede ayudarme a deshacerme de la memoria alámbrica. ¿Pero puedo hacer eso?

¿Hay algún ejemplo por Apple u otra persona (libro o artículos en línea) que explica cómo utilizar los instrumentos (en un pequeño detalle con el ejemplo?) Y para afinar la aplicación para la memoria y el rendimiento?

Gracias.

Respuesta

8

Ahora que tenemos las respuestas de "solo decir no" para la liberación automática, pensé en agregar un consejo sobre cómo usar la liberación automática de forma más efectiva. Para bien o para mal, no todo el mundo va a evitar por completo la liberación automática, solo por el hecho de que Apple proporciona tantos métodos de conveniencia que le entregan objetos liberados automáticamente.

No puede simplemente decirle al grupo de liberación automática que libere cualquier objeto que no esté utilizando. No hay recolección de basura, ¿y qué más va a saber?

Lo que PUEDE hacer es crear un grupo de autorrelease local y luego liberarlo cuando ya no necesite los objetos liberados automáticamente locales. Si tiene un bloque donde está creando objetos liberados automáticamente, se asegurará de que se liberen creando un grupo de autorrelease local al inicio del bloque (solo alloc/init it, no se requiere magia) y luego liberará el grupo en el bloque. Fin del bloque.Y voila, y los objetos en la piscina también se liberan.

Autorelease pools nest, así que tenlo en cuenta si haces esto. Si lanza un grupo de autorrelease, asegúrese de que sea el grupo asignado más recientemente y no otro.

1

La memoria liberada automáticamente se libera cuando el control vuelve al sistema, pero solo cuando lo desea. Si desea forzar la liberación de la memoria, utilice "liberar", que funciona en ese momento.

Debe tenerse en cuenta que debido a la fragmentación de la memoria, la asignación y desasignación de un bloque de memoria puede parecer que no lo lleva de vuelta al punto de partida en términos de memoria "libre" mensurable.

, Tony

1

Por motivos de rendimiento, Apple recomienda que conserve/liberación de los objetos a sí mismo siempre que sea posible. su liberación automática puede causar un uso excesivo de la memoria ya que los objetos liberados automáticamente no siempre se liberan de inmediato.

En otras palabras, si sabes que terminaste con un objeto, explícalo.

0

De acuerdo con Apple, no debe usar la liberación automática y en su lugar debe retener y liberar objetos explícitamente según sea necesario. la liberación automática no liberará un objeto tan pronto como su función termine. Si en la vista de tabla está utilizando imágenes descargadas de un servicio web, pruebe y guarde en caché estas imágenes y vuelva a utilizarlas si es posible. Otra opción es obtener solo las imágenes que se muestran.

1

La UITableView tiene una forma de reutilizar las celdas de la tabla que ya no se muestran. De esta forma, si solo muestra 6 celdas en la pantalla a la vez, no seguirá generando más a medida que se desplaza, sino que reutiliza las celdas que se han salido de la pantalla. Siempre que desee crear una nueva celda, primero consulte la tabla para ver si tiene alguna para volver a utilizar y, si no, cree una nueva.

un ejemplo de esto se puede encontrar en la diapositiva 55 de la nota del curso standford iphone encontrada aquí: http://www.scribd.com/doc/7671058/Standford-CS-193P-11Performance

Cuestiones relacionadas