2009-03-20 9 views
9

Necesita consejos sobre cómo depurar esto. Soy nuevo en entornos limitados y no tengo experiencia previa en programación de teléfonos integrados o inteligentes, así que podría usar algunas pistas. Conociendo ya: Instrumentos, análisis estático de Clanger, revisión manual de código, etc. ¡Los instrumentos parecen ser muy útiles en general, pero consumen mucho tiempo y se congelan durante mucho tiempo! Clanger también me ha ayudado mucho también. Parece que estoy consumiendo demasiada memoria en general y me pregunto qué buena estrategia es. ¿Lanzo algunos objetos de nivel superior? ¿Hay una 'estrategia preferida'?¿Cuál es el mejor enfoque para depurar la aplicaciónDidReceiveMemoryWarning en iPhone?

¿Me pregunto si alguien ha abordado esto con éxito y si tienen alguna otra sugerencia? Gracias a todos.

Respuesta

2

Básicamente, está recibiendo esta advertencia porque (como era de esperar) el iPhone tiene peligrosamente poca memoria. Esto generalmente puede ser por una de dos razones;

  1. Tiene una pérdida de memoria.
  2. Está asignando demasiados objetos y necesita volver a visitar su diseño.

Para la primera, debe ejecutar los instrumentos y examinar las asignaciones de memoria. Esto realmente puede ralentizar su aplicación (y requiere memoria adicional) así que intente probar áreas de su aplicación de a una por vez. P.ej. si tiene varias vistas cambie entre ellas un par de veces.

Por el segundo, tendrá que examinar las cosas que está haciendo que podrían dar lugar a grandes asignaciones de memoria. Por ejemplo, si está escribiendo un navegador de Flickr, es posible que necesite reducir el número de imágenes que ha cargado en cualquier momento, o liberar algunas que no haya utilizado cuando reciba esta advertencia.

Estas son las únicas reglas generales que puedo sugerir sin saber más acerca de su aplicación.

Lamentablemente, no hay forma real (que yo sepa) de obtener cifras para la asignación de memoria actual desde el sistema operativo del iPhone. Esto hace que sea realmente difícil aislar las áreas de su aplicación que están inadvertidamente hambrientas de memoria.

+1

3. Usted tiene que lidiar con la red xml/imágenes/datos que no se pueden cargar todo en la memoria a la vez (como un ordenador de sobremesa) y debe ser tratada en pedazos más pequeños – slf

+0

En términos de ideas para un mejor diseño , el ejemplo de Libros de SQLite en el documento de Apple describe una estrategia de hidratación/deshidratación. El archivo léame proporciona una excelente explicación del concepto y tiene objetos de datos que implementan este patrón. – hyuan

5

Hay muchos buenos artículos para la administración de memoria en una aplicación de iPhone. Aquí hay algunos enlaces útiles.

Cosas que usted debe, en general, cuidar de

  1. liberar cualquier variables que no necesitas
  2. Siempre maneje didReceiveMemoryWarning y suelte cualquier variable no está en uso
  3. Detener los procesos de memoria pesada en applicationDidReceiveMemoryWarning como reproducción de audio/vídeo, etc. UIImagePickerController

EDIT Esto no se aplica más. imageNamed: tenía problemas de almacenamiento en caché antes de las versiones 3.x del sistema operativo.El problema ya no existe y debe usar imageNamed: (hace que implementar la visualización retina sea más fácil)

  1. NO use imageNamed: para crear objetos UIImage.
+0

Sé que esto es viejo, pero me pregunto por qué no 4 anterior? ¿Qué pasa con el uso de imageNamed? – ferdil

+3

El punto imageNamed: no aplica ahora. Antes de 3.x, imageNamed solía almacenar en caché las imágenes aumentando la memoria utilizada por la aplicación. Lo han mejorado tremendamente ahora. Entonces, con 3.xy superior, puedes usar este método. – lostInTransit

Cuestiones relacionadas