2009-08-25 14 views
6

alt textLa comprensión del instrumento de verificación de fugas de memoria - iPhone

Por encima de imágenes dadas es de mis fugas de aplicación.

Aquí quiero entender que, en Detalles detallados, puede ver diferentes colores como el verde claro, el rosa claro, el marrón claro, el violeta claro.

¿Qué significa cada color?

Ahora la otra confusión es "¿Cómo localizar el código que está creando una pérdida de memoria?"

Hasta qué límite de pérdida de memoria - el iPhone real puede continuar. (10 bytes suponer ningún problema, no hay problema 20 bytes & 200 bytes es un problema)

  • lo que cada color indica?
  • ¿Qué color indica nuestro código/De qué detalle podemos obtener el código donde hemos asignado el objeto & se olvidó de tratarloc él?

(Por ejemplo - El chasquido de segunda célula UIKit en detalle - no podemos llegar al código)

  • ¿Por qué tenemos que resolver todas las fugas? - incluso una sola fuga puede bloquear iPhone?
  • ¿Por qué iPhone permite que las pérdidas permanezcan en la memoria?/¿por qué la recolección de basura no se realiza automáticamente después de la finalización de la aplicación?
  • Si trato de desasignar objetos que deben desasignarse de acuerdo con los instrumentos, Mi aplicación finaliza anormalmente. Si no lo hago, mi aplicación se ejecuta perfectamente, ¿cómo?
  • ¿Por qué se sugiere que espere en una vista de hasta 10 segundos o más, si hay una fuga, los instrumentos detectarán la fuga?

Respuesta

14

Ignorar los colores, en el que uno de [Dashboard viewDidLoad] es la fuente de la fuga, algo en la forma en que está inicializar un URLConnection (posiblemente no lo hizo libre que cuando la conexión se ha terminado?)

ahora a responda las otras preguntas que tuvo:

  • ¿Por qué debemos resolver todas las filtraciones? - incluso una sola fuga puede bloquear iPhone?

Sí. Parte de la razón no es solo que simplemente se quedará sin memoria, pero como la memoria del teléfono completo es muy escasa, una aplicación de vigilancia supervisa constantemente su aplicación y la apagará antes de tiempo si considera que el uso de la memoria solo creciendo ...

  • ¿Por qué iPhone permite que se guarden las fugas en la memoria?/¿por qué la recolección de basura no se realiza automáticamente después de la terminación de la aplicación ?

Toda la memoria de la aplicación se libera cuando se cierra la aplicación.

  • Si trato de dealloc objetos que debe cancelar la asignación de acuerdo con instrumentos, Mi solicitud termina de forma anormal.Si no hago dealloc, Mi aplicación ejecuta perfectamente, ¿Cómo?

Aquí no puedo evitar, que realmente necesita para leer más sobre el ciclo de conservar la memoria/liberación ... si se suelta un objeto que tiene una cuenta de retención de 0, la aplicación se bloquea porque el objeto se ha ido .

  • Por qué se sugiere que espere en una vista hasta 10 segundos o más, si existe una fuga, la fuga será detectarse mediante los instrumentos?

Porque los instrumentos funcionan al muestrear la memoria de vez en cuando, por lo que puede ser que los instrumentos tarden un poco en aprender a leer la memoria después de una acción.

+2

+1 Excelente respuesta Kendall. @sagar, debe tener en cuenta que para la pregunta 3, debe * nunca * llamar a dealloc directamente, solo retener o liberar (solo la excepción es [super dealloc]). Creo que su solución es implementar la liberación automática, ya que parece que su bloqueo se debe a la liberación temprana de objetos. por ejemplo [[[NSArray alloc] init] autorelease]; – h4xxr

3

Los colores representan las diferentes bibliotecas que está atravesando la pila de llamadas.

La pérdida es causada por el marco en el código que realizó la asignación, incluso si la asignación real se lleva a cabo en una biblioteca de sistema operativo. Instruments le muestra exactamente donde se asignó la memoria filtrada. Tendrá que averiguar qué línea de su código dio como resultado la asignación filtrada, que será uno de los cuadros en la pila de la derecha.

El iPhone real no tiene mucha RAM disponible para su aplicación. Tiendo a estimar de manera conservadora unos 25MB de RAM para que mi aplicación funcione. Cualquier fuga, por pequeña que sea, puede hundir la nave proverbial si el código se usa lo suficiente.

5

En primer lugar, las cosas en la pila están coloreadas por la biblioteca de la que proceden, por lo que no contiene demasiada información.

En segundo lugar, en lugar de preocuparme por la cantidad de fugas que puede tener el iPhone, me centraría en no tener fugas.

para encontrar fugas, hay un par de opciones:

  • Uso del CLANG static analyzer en la construcción de su proyecto
  • Busque fugas de forma manual. Debe siempre seguir las reglas de gestión de memoria: si alloc, retain o copy un objeto (incluyendo el uso de @property (retain) o (copy)), que necesidadrelease o autorelease ella.
1

Busque el nombre de su aplicación en la vista extendida de la pila. La asignación de memoria generalmente se muestra al final, para que sepa exactamente qué biblioteca es responsable de la asignación de memoria. Por lo tanto, debe rastrear desde la línea su código hacia abajo hasta el final. Los colores simplemente hacen más fácil rastrear líneas de código, que están relacionadas con las mismas bibliotecas. Las mismas llamadas a la biblioteca se colorearán con el mismo color.

En cuanto a la fuga de rastreo en sí. Primero acceda a la llamada de su aplicación haciendo doble clic en la línea en la vista ampliada e intente comprender qué filtra exactamente. Algunas veces puede reemplazar la llamada con un sustituto sin fugas. Por ejemplo, utilicé una llamada imageNamed para recuperar imágenes del paquete, la aplicación se bloqueaba constantemente debido a la escasez de memoria. Acabo de buscar en Google imageNamed leaks y encontré un artículo muy útil sobre cómo implementar Image Cash en mi aplicación. De hecho, las fugas de API de imageNamed. Hay una API que se filtra en el SDK de iphone.

Además, intente comprobar cómo está trabajando con alloc/retain/release y demás, ya sea que libere o libere automáticamente la memoria asignada.

Buena suerte en su trabajo de detective.

+0

@Nava Carmon - Si tiene un enlace de esa API, tiene fugas. ¿Podrías ponerlo en tu respuesta? Gracias. –

0

Yo también tengo problemas con fugas en los instrumentos. Ejecuto mi aplicación hoy por primera vez usando fugas y encontré varias filtraciones. Las filtraciones no deberían ser filtraciones porque no hay forma de que se filtren, a menos que se esté ejecutando algún código mágico y aumentando el conteo retenido de mis objetos. Entiendo las pautas de administración de memoria, sé cómo usar grupos de liberación automática, etc. Pero incluso una aplicación basada en vista vacía contenía fugas si le pongo algunos controles. Y solo haz clic 2-3 veces. Sigue adelante e inténtalo. Realmente no entiendo los instrumentos de información que estoy tratando de proporcionar. ¿Se filtran realmente esas "filtraciones" o solo cosas que son sospechosas para la aplicación de instrumentos? En caso de una aplicación vacía sin código de usuario, ¿solo unos pocos controles colocan una memoria de fuga de vista vacía?

+0

No creo que sean "cosas" sospechosas. El instrumento de fuga comprueba si hay una referencia a un bloque de memoria en la memoria grabable, los registros y la pila de la aplicación. Si no hay ninguno, y el bloque de memoria todavía existe, el instrumento considera el búfer como una fuga. – hmak

+0

¿Está esto en el simulador o en el dispositivo? Descubrí que las "fugas" detectadas en el simulador no aparecen cuando se ejecuta en el dispositivo real, así que ya no me molesto en perfilar las fugas en el simulador. – daver

+0

Las fugas fueron diferentes en el dispositivo, en general, hubo menos. Dejé de desarrollar para iPhone. –

Cuestiones relacionadas