| Artículos | 01 MAY 2009

Desarrollo en Cocoa (4ª parte)

Crea aplicaciones en Objective-C con las herramientas de Apple

Compartir

Geppy Parziale.
En el capítulo del número anterior, comprobamos cómo la gestión de la memoria podía crear problemas de estabilidad en una aplicación en el caso de que no se realice de forma correcta.
Uno de los temas más importantes en el desarrollo de software es sin duda la fase correspondiente al control de calidad (QA). Éste es el momento del proyecto en el cual se verifica que nuestra aplicación se comporta de manera óptima con el uso de los recursos (memoria, periféricos, discos, etc.) y también en cuanto a consumo de ciclos del procesador. De hecho se trata de un tema muy amplio que va más allá del espacio disponible para este artículo. No obstante, dado que la última vez vimos cómo se gestionan los objetos de Cocoa en la memoria, en esta ocasión nos centraremos en ver cómo podemos mejorar nuestro código para evitar pérdidas inútiles de memoria (Memory Leaks o fugas de memoria).
Por ejemplo, en anteriores capítulos de este curso hemos visto que cuando creamos un objeto con la secuencia de métodos alloc e init, tenemos que utilizar un release o un autorelease para liberar dicho objeto. Si no hacemos esto, el objeto queda en memoria ocupándola inútilmente hasta que finalice la ejecución de la aplicación, momento en el que será el propio sistema operativo quien reclame para sí toda la memoria consumida (tanto la física como la virtual).
Si el objeto en cuestión es muy pequeño no hay problema (aunque dejarlo en memoria no sea una forma muy elegante de programar), pero si el objeto es muy grande (ocupa mucha memoria) o si se queda en memoria junto con otros muchos objetos, entonces el resultado final puede ser desastroso: o bien se colapsa nuestra aplicación o su ejecución se vuelve muy lenta. Sin duda, la función del recolector de basura (Garbage Collector) nos ayuda mucho en la gestión de la memoria, pero, como ya se ha tratado con anterioridad, no siempre es posible utilizar esta funcionalidad.
Apple nos proporciona un conjunto de herramientas para que podamos analizar nuestra aplicación de modo que podamos detectar y eliminar con facilidad las fugas de memoria. Una de estas herramientas es Instruments y que puedes encontrar en la ruta Development > Applications > Instruments.

Elegir el instrumento correcto
La utilidad Instruments permite realizar, entre otras muchas cosas, un análisis del uso de la memoria, del diseño y de la gestión de los datos. Aunque Apple aconseja utilizar siempre Instruments antes de distribuir una aplicación, se tiene que decir que la documentación relativa a esta herramienta es un poco pobre, lo que obliga a la mayoría de los programadores a saltarse la fase del QA. Y esto se refleja, por ejemplo, en la baja calidad de muchas de las aplicaciones que se venden en el App Store. Te habrá pasado que una aplicación de tu iPhone se cierre de golpe: ¡es muy probable que el programador no haya utilizado Instruments!
Entonces, para completar lo que vimos el mes pasado, vamos a echar un vistazo a las posibilidades de Instruments y, más exactamente, a las herramientas necesarias para llevar a cabo el análisis de la gestión de la memoria de tu aplicación tanto en Cocoa como en Cocoa Touch. Para verificar si tu aplicación genera fugas de memoria, tienes que utilizar la herramienta Leaks de Instruments.
Puedes lanzar Instruments de varias maneras. Seguramente la más cómoda consista en utilizar el menú de Xcode. Teniendo abierto tu proyecto en Xcode (no te olvides de compilarlo antes de continuar), elige Start with Performance Tool > Leaks del menú Run.
Como resultado de dicha acción, se abrirá Instruments que lanza tu aplicación y empieza a grabar una serie de datos necesarios para el análisis. Si has abierto Instruments desde el Finder haciendo doble clic sobre su icono, es necesario que elijas la aplicación que vas a analizar (Default Target) y pulses el botón Record.
Al tiempo que Instruments va registrando los datos, utiliza tu aplicación con normalidad y una vez que creas que tienes información suficiente para realizar el análisis, sólo tendrás que pulsar el botón de Stop para detener la función de grabación de los datos.
Habrás notado que aunque hayas elegido sólo Leaks, Instruments habrá cargado y utilizado también la herramienta ObjectAlloc. Este módulo de Instruments es el que se encarga de realizar un seguimiento de los objetos durante su vida desde que son asignados a la memoria hasta que se liberan y se eliminan de la misma. Por el contrario, Leaks sirve para identificar los objetos que se han quedado en la memoria ocupándola inútilmente.
En la parte superior de la ventana observarás que hay un cursor blanco que durante la grabación se va moviendo. Utilizando el Inspection Range puedes filtrar los resultados de tu análisis en un determinado intervalo de tiempo. Esto te ayuda a entender más fácilmente cuándo un objeto ha sido asignado o liberado de la memoria.

Identifica los objetos
A continuación selecciona el menú View > Detail. De este modo aparecerá en la parte inferior de la ventana de Instruments una nueva vista encargada de contener la información correspondiente a cada tipo de objeto creado por tu aplicación durante la sesión de grabación.
Esta nueva vista nos permite acceder a la siguiente información: el tipo de objeto (Category), el número de objetos asignados a la memoria y que todavía permanecen en ella (# Net), el número total de objetos asignados (#Overall), las cantidades de memoria en ambos casos (Net Bytes y Overall Bytes), y una proporción entre el número de objetos que permanecen todavía en memoria y el número total de objetos asignados (# Allocations (Net / Overall).
Instruments también te ofrece la posibilidad de analizar los objetos del mismo tipo, proporcionando información como el método que ha creado el objeto (Responsible Caller), el instante de tiempo cuando se ha creado dicho objeto (Creation Time) y la librería de referencia (Responsible Library).
Por último, Instruments proporciona toda la información sobre la vida de objetos seleccionados en la ventana anterior.
Si ahora seleccionas cualquier tipo de objeto, notarás que una flecha aparece a la derecha del tipo. Haciendo clic sobre dicha flecha, Instruments te enseña todos los objetos creados que pertenecen a esta categoría y que han sido creados durante la grabación. Si pinchas sobre uno de ellos, aparecerán los detalles relativos a este objeto.
Entre ellos tendrás el tipo de evento (Malloc, Free, CFRelease, CFRetain, etc.) y el método que ha generado tal evento (correspondiente a la columna Responsible Caller). Si seleccionas uno de los eventos y eliges Extended Detail en el menú View, entonces Instruments te ofrecerá más información sobre el objeto seleccionado.
La vista Extended Detail es muy importante porque la utilizarás como el enlace a nuestro código, donde te dirigirás para eliminar la fuga de memoria en cuestión. Para que te resulte aun más sencillo, haz clic sobre el pequeño engranaje cerca de Stack Trace y marca las elementos como se muestra en “Objetos sospechosos”. De esta manera podrás localizar fácilmente dónde hay problemas en tu código.

Mejora la agilidad de tu aplicación
La herramienta ObjectAlloc es muy útil para mejorar la agilidad de una aplicación. De hecho, es muy común asignar objetos o cargar d

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información