Introducción a Objective-C: Nuestra primera aplicación

Beware: This post was published 5 years ago and its content may be outdated.

¿Qué es Objective-C? ¿Qué es Cocoa? ¿Qué es la Programacion Orientada a Objetos (POO)? ¿Y la arquitectura de Modelo Vista Controlador (MVC)? Dar los primeros pasos en la programación para Mac OS X, iPhone y iPad puede ser algo complicado si no sabes dónde buscar la información (y aún más difícil si no sabes inglés, imprescindible en el mundo de la informática). Hace año y medio, cuando yo comencé a aprender a programar para el iPhone (no tengáis prisa, sigo haciéndolo y me queda para mucho rato), el primer problema que tuve fue encontrar fuentes de información para dar los primeros pasos, así que he decido escribir esta serie de tutoriales para facilitar la tarea a aquellos que, como yo, quieran aprender a programar para el iPhone (extensible a Mac OS X y iPad). Tampoco esperéis ser unos maestros de Objective-C después de haber leído esta serie de tutoriales (que iré publicando cuando vaya teniendo tiempo para redactarlos), pues mis conocimientos son fruto del autodidactismo y seguramente no utilice los términos adecuados ni profundice del todo en los conceptos que trate. Sin embargo espero que os sirva para dar el primer paso y poder continuar después con textos mejor redactados, más exactos y más profundos.

En este serie de tutoriales voy a suponer que se tienen unos conocimientos básicos de programación, que se entiende el significado de términos como “código fuente”, “función” o “variable”. Cualquiera que haya programado antes en cualquier lenguaje de programación conocerá su significado. El único término nuevo que puede que no conozcan aquellos que sólo han programado en lenguajes interpretados (como PHP) es el de “compilar”. Para simplificar, podríamos decir que compilar un programa es traducir el código que nosotros escribimos en un código que la máquina pueda entender.

Ahora bien, queda diferenciar cuatro conceptos:

  • Objective-C: Es el lenguaje de programación que se suele usar en Mac OS X. Digo se suele usar porque también se pueden programar aplicaciones en C, C++, Objective-C++, etc.
  • Cocoa: Es un Framework, un conjunto de funciones que facilitan la tarea al programador. Tareas como modificar una cadena de caracteres, descargar archivos de Internet, gestionar matrices o la memoria se hacen mucho más sencillas con este Framework. De hecho programar en Objective-C sin usar Cocoa es algo poco usual y no lo veremos en este tutorial (yo, por ejemplo, no he programado nada en Objective-C sin tener vinculado Cocoa). Cocoa Touch es la versión de Cocoa para iPhone, iPod Touch y iPad.
  • Programación Orientada a Objetos: Es un paradigma de programación del que hablaremos más adelante. Objective-C es un lenguaje de Programación Orientada a Objetos. En Objective-C prácticamente todo es un objeto, cosa que veremos más adelante.
  • Modelo Vista y Controlador: Es una arquitectura en la que se separa la parte lógica de la aplicación de la interfaz y de los datos que se gestionan. Realmente no es imprescindible hacer uso de esta arquitectura, pero hacerlo es una buena idea, simplifica la tarea y hace las aplicación más fáciles de extender. En nuestros primeros pasos no haremos uso de esta arquitectura, pero a medida que vayamos avanzando iremos viendo en qué consiste y qué beneficios aporta.

Menú de la aplicación de Xcode

Menú Archivo

Menú Archivo

Plantillas del proyecto de Xcode

Plantillas del proyecto de Xcode

Dicho esto, pasemos a presentar a los sospechosos habituales. Cuando programemos en Mac OS X trabajeros con Xcode, el Entorno de Desarrollo Integrado de Apple. Xcode viene en los discos de instalación de Mac OS X, y se puede descargar de forma gratuita (previo registro) desde la web de Apple. Durante estos tutoriales usaremos como plantilla del proyecto la plantilla de aplicación para la línea de comandos, ya que así evitamos tener que preocuparnos de elementos más complejos como la interfaz gráfica de la aplicación. Crear un nuevo proyecto es sencillo: Basta con ir al menú File » New project… . Aparecerá una ventana en la que podremos seleccionar la plantilla para el proyecto que vamos a crear. En estos tutoriales elegiremos la plantilla Mac OS X » Application » Command Line Tool.

Nuestro primer proyecto Veremos una ventana como la que tenéis en la izquierda. En la parte izquierda de la ventana tenemos acceso a los archivos del proyecto. De los archivos que se pueden ver en la imagen, el que nos interesa ahora es NOMBREPROYECTO.m. Veréis un código como el siguiente:

#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 // insert code here...
 NSLog(@"Hello, World!");
 [pool drain];
 return 0;
}
Vayamos línea a línea. La primera línea importa el Framework Foundation en nuestra aplicación. El Framework Cocoa está compuesto por dos Frameworks diferentes: Foundation y Application Kit. Foundation incluye las funciones que trabajan en la trastienda sin que el usuario lo vea, pero que al desarrollador le vienen fenomenal. Por su parte, Application Kit se encarga de la parte visual de la aplicación (como comprenderéis, esto es una versión resumida de lo que realmente hacen, así que tampoco lo toméis al pie de la letra). Si os fijáis en la sintaxis, podéis ver tres partes: La almohadilla (#), los signos menor y mayor que (<>) y el nombre del Framework.

La almohadilla introduce instrucciones para el preprocesador. Las que más comúnmente se usan con #import y #define. #import incluye otros archivos y Frameworks en el archivo actual. #define permite declarar constantes. Las constantes sirven para definir un valor que es fijo en toda la aplicación, pero que si nos interesa cambiar, podemos hacerlo modificando una sóla línea. Imaginad, por ejemplo, que queremos definir nuestra edad. Si sólo la ponemos en una línea no hay ningún problema, pero ¿y si la incluímos en 5, 10, 200 ó 5000 líneas? Es una faena tener que ir buscando cada lugar en el que hemos puesto ese valor. Con las constantes basta con poner la constante en lugar de nuestra edad, y definir el valor de la constante con el valor de nuestra edad. Cuando queramos modificar el valor de nuestra edad, sólo lo cambiaremos una vez, en lugar de tantas veces como uso se haga de ella.

A la hora de importar archivos, hay dos tipos de archivos que podemos importar: Frameworks del sistema y otros archivos de nuestro proyecto. Cuando importamos Frameworks del sistema, usamos los signos mayor e igual que (<>). Si importamos archivos de nuestro proyecto, usamos comillas (“).

La siguiente línea define la función main. La función main es la función principal de la aplicación, la única función que siempre se ejecuta. La estructura de la función es la misma estructura que C, sin embargo en Objective-C la mayoría de las funciones (métodos) se definen con una sintaxis diferente, así que no me voy a parar a explicarla.

Centrémonos en el siguiente bloque:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 // insert code here...
 NSLog(@"Hello, World!");
 [pool drain];
 return 0;
En este bloque vemos unas cuantas líneas curiosas. Vayamos a la primera:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Esta es la sintaxis para crear un objeto en Objective-C. El primer NSAutoreleasePool es la clase del objeto que vamos a crear. El asterisco (“*”) indica que a continuación se presenta un objeto (lo veremos más adelante). pool es el nombre de la variable (objeto) que estamos creando. La segunda parte del código: [[NSAutoreselasePool alloc] init], se trata de un mensaje enviado a una clase, que es a su vez el valor del objeto que estamos creando. Los mensajes se pueden enviar tanto a clases como a objetos, lo veremos más adelante, no os preocupéis.

A continuación vemos una línea que comienza con dos barras (//). Cuando una línea va introducida por dos barras, se trata de un comentario. Los comentarios se eliminan de la aplicación al compilarla: son sólo una ayuda al programador durante la programación, para saber qué hace cada cosa o para qué se usa una variable. Los comentarios también se pueden introducir con /* Comentario */.

// Con dos barras el comentario ocupa toda la línea
/* Con barra y asterisco es necesario terminar el comentario con asterisco barra, así que el comentario
aún no ha acabado en esta línea,
sino que acaba en esta otra */

La siguiente línea es la llamada a una función.

NSLog(@"Hello, World!");

Objective-C es un superconjunto de C, con lo cual comparte algunas características con el anterior. Esta forma de llamar a la función es típica de C. Las funciones tienen dos partes: La primera (NSLog en este caso) es el nombre de la función. La segunda, que se encuentra entre paréntesis (“()”), son los argumentos de la función. En este caso, el argumento es: @”Hello, World!”. Cuando unas comillas están precedidas por un arroba (@), sabemos que se trata de una cadena de texto, un objeto de clase NSString (lo trataremos más adelante). Tras los paréntesis encontramos un punto y coma (;). Esto indica el final de una instrucción (todas las instrucciones en C y Objective-C van sucedidas por un punto y coma (;), a excepción de aquellas instrucciones que son argumentos de funciones (como el @”Hello, World!”)  o de mensajes (lo veremos más adelante).

La función NSLog() muestra el texto que se le envía como argumento en la terminal. Durante el desarrollo de la aplicaciones es una función muy útil, como veréis a medida que avancemos en los tutoriales, para saber el valor de una variable en cada momento o para recibir un aviso cuando se ejecuta un método.

[pool drain];

Esta línea le envía el mensaje drain al objeto pool, creado anteriormente. Veremos más adelante todo esto, en otro tutorial de esta serie. A continuación vemos:

return 0;

Esta línea le devuelve el valor 0 al Sistema Operativo. La función main tiene que devolver un valor que indica si la aplicación se ha ejecutado correctamente o si ha encontrado errores durante su ejecución. El valor 0 indica que todo ha ido bien.

Nuestra primera aplicación ejecutándose

Nuestra primera aplicación ejecutándose

Para probar la aplicación hay que pulsar el botón Build and Run, o pulsar Comando + Enter. La aplicación se compilará y se ejecutará. Como la aplicación no tiene interfaz, se ejecutará sin ver nosotros nada. Para poder ver el texto enviado por nuestra aplicación (Hello, World!), tenemos que mostrar la consola (Menú Run » Console o Comando + Mayus + R). Veremos algo como la imagen de la izquierda.

Y esto es todo por este primer tutorial. En los próximos comenzaré a tratar la Programación Orientada a Objetos en Objective-C e introduciré los conceptos de clase, objeto y método.