modo - Entender el instrumento para la comprobación de fugas de memoria-iPhone
liberar espacio en iphone 6 (5)
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, etc., ya sea que libere o libere automáticamente la memoria asignada.
Buena suerte en tu trabajo de detective.
Por encima de las imágenes dadas, mi aplicación tiene fugas.
Aquí quiero entender que, en Detalles detallados, puedes ver diferentes colores como el verde claro, el rosa claro, el marrón claro y el violeta claro.
¿Qué indica cada color?
Ahora la otra confusión es "¿Cómo localizar el código que está creando una fuga de memoria?"
Hasta qué límite de pérdida de memoria, el iPhone real puede continuar. (supongamos que 10 bytes no son un problema, 20 bytes no son un problema y 200 bytes son un problema)
- ¿Qué indica cada color?
- ¿Qué color indica nuestro código / De qué detalle podemos obtener el código donde hemos asignado el objeto y olvidado deshacerlo?
(Por ejemplo, al hacer clic en la segunda celda de UIKit en detalle) no podemos acceder al código)
- ¿Por qué debemos resolver todas las filtraciones? - 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 ser desasignados de acuerdo con los instrumentos, Mi aplicación termina anormalmente. Si no lo hago, mi aplicación se ejecuta perfectamente, ¿cómo?
- ¿Por qué se sugiere esperar en una vista de hasta 10 segundos o más, si hay una fuga, los instrumentos detectarán la fuga?
En primer lugar, las cosas en la pila están coloreadas por la biblioteca de la que proceden, por lo que no contiene tanta información.
En segundo lugar, en lugar de preocuparme por la cantidad de fugas que puede tener el iPhone, me concentraría en no tener pérdidas.
Para encontrar fugas, hay un par de opciones:
- Use el analizador estático CLANG cuando construya su proyecto
- Busque fugas de forma manual. Siempre debe seguir las Reglas de administración de memoria: si
alloc
,retain
ocopy
un objeto (incluido el uso de@property (retain)
o(copy)
), deberelease
oautorelease
.
Ignore los colores, en ese caso [DashBoard viewDidLoad] es la fuente de la fuga, algo sobre cómo se está inicializando un URLConnection (¿posiblemente no lo liberó cuando se terminó la conexión?)
Ahora para responder a las otras preguntas que tenías:
- ¿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 solo hay mucha memoria para todo el teléfono, una aplicación de vigilancia está constantemente monitoreando su aplicación y la apagará temprano si ve uso de memoria. solo creciendo ...
- ¿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?
Toda la memoria de la aplicación se libera cuando la aplicación se cierra.
- Si trato de desasignar objetos que deben ser desasignados de acuerdo con los instrumentos, Mi aplicación termina anormalmente. Si no lo hago, mi aplicación se ejecuta perfectamente, ¿cómo?
Aquí no puedo ayudar, realmente necesita leer más sobre el ciclo de retención / liberación de la memoria ... si suelta un objeto que tiene un conteo retenido de 0, la aplicación falla debido a que el objeto se ha ido.
- ¿Por qué se sugiere esperar en una vista de hasta 10 segundos o más, si hay una fuga, los instrumentos detectarán la fuga?
Porque los instrumentos funcionan al muestrear la memoria de vez en cuando, por lo que puede llevar un poco más para que los instrumentos se pongan a leer la memoria después de una acción.
Los colores representan las diferentes bibliotecas que está atravesando la pila de llamadas.
La fuga 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 dónde 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.
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?