example - swift ios basics
¿Cómo depurar las pérdidas de memoria cuando el instrumento Leaks no las muestra? (2)
En Xcode 8, puede hacer clic en el botón "Debug Memory Graph", en la barra de herramientas de depuración (que se muestra en la parte inferior de la pantalla):
Simplemente identifique el objeto en el panel izquierdo que cree que debería haberse desasignado, y le mostrará el gráfico del objeto (que se muestra en el lienzo principal, arriba). Esto es muy útil para identificar rápidamente dónde se establecieron las referencias fuertes en el objeto en cuestión. A partir de aquí, puede comenzar su investigación, diagnosticando por qué esas referencias fuertes no se resolvieron (por ejemplo, si el objeto en cuestión tiene una referencia fuerte de otra cosa que debería haberse desasignado, mire también el gráfico de ese objeto y puede encontrar el problema (por ejemplo, ciclos de referencia fuertes, temporizadores repetidos, etc.).
Tenga en cuenta que en el panel derecho, estoy viendo el árbol de llamadas. Obtuve eso activando la opción de registro "malloc stack" en la configuración del esquema:
De todos modos, después de hacer eso, uno puede hacer clic en la flecha al lado de la llamada al método relevante que se muestra en el seguimiento de la pila en el panel derecho de la primera captura de pantalla anterior, y puede ver dónde se estableció originalmente esa fuerte referencia:
La técnica de diagnóstico de memoria anterior (y más) se demuestra en la última parte de la depuración visual de WWDC 2016 con Xcode .
La técnica tradicional de instrumentos (especialmente útil si se usan versiones anteriores de Xcode) se describe a continuación, en mi respuesta original.
Sugeriría utilizar la herramienta "Asignaciones" de los instrumentos con la función "Registrar recuentos de referencia":
Luego puede ejecutar la aplicación en Instrumentos y luego buscar su clase que sabe que tiene fugas y profundizar haciendo clic en la flecha:
Luego puede profundizar en los detalles y observar el seguimiento de la pila utilizando el panel "Detalles extendidos" a la derecha:
En ese panel de "Detalles extendidos", enfóquese en su código en negro en lugar de las llamadas del sistema en gris. De todos modos, desde el panel "Detalles extendidos", puede profundizar en su código fuente, directamente en Instrumentos ::
Para obtener más información y demostraciones sobre el uso de instrumentos para rastrear problemas de memoria, consulte:
- WWDC 2013 video Problemas de memoria de reparación
- WWDC 2012 video iOS Rendimiento de la aplicación: memoria
Tengo una aplicación de iOS escrita en Swift que está perdiendo memoria; en ciertas situaciones, algunos objetos deberían liberarse, pero no lo son.
Aprendí sobre el problema simplemente agregando mensajes de depuración
deinit
como este:
deinit {
println("DEINIT: KeysProvider released")
}
Por lo tanto, el mensaje deinit debe estar presente en la consola después de tales eventos que deberían hacer que se libere el objeto. Sin embargo, para algunos de los objetos que deberían liberarse, falta el mensaje. Aún así, Leaks Developer Tool no muestra ninguna fuga. ¿Cómo resuelvo tal situación?
Utilice los instrumentos para verificar si hay pérdidas y pérdida de memoria debido a la memoria retenida pero no a la perdida. El último es la memoria no utilizada que todavía se señala. Utilice Mark Generation (Heapshot) en el instrumento de asignaciones en instrumentos.
Para ver cómo usar Heapshot para encontrar memoria creap, vea: blog bbum
Básicamente, el método es ejecutar la herramienta de asignación de instrumentos, tomar un montón, ejecutar una iteración de su código y tomar otro montón repitiendo 3 o 4 veces. Esto indicará memoria asignada y no liberada durante las iteraciones.
Para averiguar los resultados revelar para ver las asignaciones individuales.
Si necesita ver dónde se producen las retenciones, las liberaciones y los lanzamientos automáticos para un objeto, use instrumentos:
Ejecutar en instrumentos, en Asignaciones, active "Grabar recuentos de referencia" (para Xcode 5 y menor, debe detener la grabación para configurar la opción). Haga que la aplicación se ejecute, detenga la grabación, profundice y podrá ver dónde se produjeron todas las retenciones, lanzamientos y autorreleases.