Introducción a la Depuración (Debugging) de código Objective-C. PARTE 1.

[Sin categoría] 0 Comentario

Esta es una pequeña guía de introducción a la depuración de código Objective-C.

La depuración nos permite identificar y resolver errores en nuestros programas. Es una tarea importante en el proceso de desarrollo de software sin embargo no siempre le dedicamos la atención necesaria cuando comenzamos a aprender un nuevo lenguaje y una nueva plataforma, cuando es el momento en que mas errores cometemos y buscamos resolverlos por intuición y a veces tanteo.

En Objective-C como en la mayoría de lenguajes modernos existen varias herramientas que nos permiten hacer la depuración de nuestro código. La mas básica es la salida en consola.

Salida en Consola

Muchas veces la simplicidad es una buena practica que también aplica a la depuración. Cuando simplemente queremos conocer los valores de variables y objetos podemos usar depuración con salida en consola. En la consola podemos ver una especie de registro con todo lo que vamos mandando hacia ésta. Para ello contamos con funciones como NSLog o printf  que son muy útiles:

 
void NSLog(NSString *format, …);
int printf(const char * __restrict, …);
int fprintf(FILE * __restrict, const char * __restrict, ...);

printf

Objective -C es un superconjunto de C. Las característica y funciones de C están disponibles cuando programamos con Objective-C. Así que podemos emplear printf y también fprintf que son funciones de la librería <stdio.h> propia de C en nuestro código Objective-C. La librería de C <studio.h> nos permite utilizar varios canales de salida o de stream entre las que tenemos Salida Estándar y Salida de Error (stdout  y stderr). Stdout  utiliza un buffer que almacena temporalmente el texto y lo vacía en el terminal en que estamos trabajando. Stderr no utiliza este buffer así que apenas recibe un texto o valor lo va vaciando en la consola. En este caso la consola no necesariamente es el mismo terminal donde se esta trabajando y normalmente se usa para diagnostico y reportes.

Si queremos mostrar un mensaje en la Salida Estandard o stdout:

 
printf("Hola Mundo\n");

Si queremos mostrar algún valor:

 
printf("El numero es %d\n", 14);

la salida seria:

"El numero es 14"

El %d es la especificación del formato que se aplicara al valor. Podemos ver mas detalle en http://www.cplusplus.com/reference/clibrary/cstdio/printf/

Si utilizamos la función fprintf podemos especificar una u otra salida. Por ejemplo:

 fprintf(stdout, "Hola Mundo\n");

es equivalente a usar printf. Si especificamos que utilice la salida de error:

 fprintf(stderr, "Error en la App\n");

Observe que el mensaje lo cambiamos ya que se supone que esta salida es para mensajes de error y no para mensajes corrientes.

También observemos los caracteres  ”\n” al final de cada texto, esto es para introducir un carácter de  nueva linea, que hace que lo siguiente aparezca en una nueva linea.  Esto es algo que quizás pocos extrañaran en la las funciones propias de Objective-c.

Hasta aquí no hemos usado Objective-C.

NSLog

NSLog es una de las funciones que nos provee el Fundation Framework y nos permite mostrar en la salida de error (stderr) el texto y valores de las variable y objetos que queramos. Observe que nos referimos a stderr y no a stdout que es la principal diferencia entre NSLog y printf. Tambien NSLog requiere como parámetro un NSString y no un puntero a un char. Un NSString es como manejamos el texto en Objective-C y este nos ofrece muchos beneficios.

Teníamos

printf("Hola Mundo\n");

Ahora con NSLog:

NSLog(@"Hola Mundo");

NSLog acepta como parametros un NSString pero puede imprimir cualquier objeto. Cualquier objeto en Objective-C significa cualquier objeto que es instancia de la Clase NSOjbect que por defecto tiene un método description que se encarga de mostrar una versión en texto del objeto.

De todas maneras NSLog espera que el parámetro sea pasado como un texto literal.

Por ejemplo si le indicamos como parámetro directamente una variable u objeto tipo NSString

NSLog(variable);

El mismo Xcode nos advierte que esto es inseguro. Si variable es un Objeto distinto a NSString nos aparece un error.

Debemos entonces usar los especificadores de formato para imprimir con NSLog. Ver especificadores de formato en Objective-C:  http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/formatSpecifiers.html

 Si queremos imprimir cualquier objeto:
NSLog(@"%@", variable);

Si queremos imprimir un numero entero :

NSLog(@"%i", 14);

Un decimal tipo double:

NSLog(@"%g", 14.5);

Importante prestar atención a que el formato que queremos aplicar sea posible su aplicación sobre la variable o valor que le indicamos.

En la segunda y última parte de esta introducción a la depuración de código Objective-C hablaremos un poco sobre herramientas mas especializadas para realizar esta depuración como son GDB y LLDB que vienen incluidas con el entorno de desarrollo Xcode.

Hasta la próxima,Saludos…

Dejar un comentario