Introducción a objective-c (II): Hola mundo

Como no podía ser de otra forma, y como en cualquier introducción a un lenguaje, en este artículo veremos el clásico Hola Mundo en Objective-C:

HelloWorld.h:
#import 

@interface HelloWorld : NSObject {
 
}
- (void)sayHello;
@end
HelloWorld.m:

#import  
#import "HelloWorld.h"

@implementation HelloWorld

- (void)sayHello
{
    NSLog(@"Hola, mundo, a las %@", [NSCalendarDate calendarDate]);
}

@end
Main.m:
int main (int argc, const char * argv[]) {
     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

     HelloWorld *hw = [[HelloWorld alloc] init];
     [hw autorelease];

    [hw sayHello];

    [pool release];
    return 0;
}

Aunque podría hacerse más sencillo, obviando la clase HelloWorld, he preferido crearla, ya que estamos hablando de un lenguaje orientado a objetos. En Objective-C los fuentes tienen la extensión .m y las interfaces .h (igual que en C). En las interfaces se definen las clases y métodos y se implementan el los .m. No confundir el interfaz de Objective-C o C con el de Java, no tienen nada que ver. Los interfaces, tal como los conocemos en Java, existen también, pero tienen otro nombre y los veremos más adelante. Los que conocéis C++, sabréis que se hace de la misma forma.

Veamos el método main, que es la entrada principal del programa. Detengámonos en la siguiente línea:

HelloWorld *hw = [[HelloWorld alloc] init];

Aquí hacemos varias cosas:
  • Definir un puntero a un objeto HelloWorld.
  • Enviar el mensaje alloc a HelloWorld. Este mensaje nos devuelve una instancia de HelloWorld.
  • A esa instancia le enviamos el mensaje init.
 Tambien se podría haber hecho así:

HelloWorld *hw = [HelloWorld new];

El mensaje new es lo mismo que enviar alloc e init pero en un solo paso. Este último, init, es un método que podemos definir para inicializar cualquier cosa que creamos conveniente cuando se crea una instancia de una clase. Es equivalente a lo que haríamos en el constructor de una clase Java. Veamos ahora como decimos Hola Mundo:

[hw sayHello]

A la instancia de HelloWorld le enviamos el mensaje sayHello. El receptor, hw, acepta el mensaje y ejecuta su código:

NSLog(@"Hola, mundo, a las %@", [NSCalendarDate calendarDate]);

Algunos os preguntaréis donde se define la accesibilidad de los métodos en Objective-C, como public o private. Bien, son todos públicos siempre, ya explicaré como hacer métodos privados.

Introducción a objective-c (I): Diferencias con C++

Empiezo con la introducción a Objective-C comentando las principales diferencias con C++. La principal diferencia entre ellos es que Objective-C deja ciertas decisiones para el tiempo de ejecución que C++ toma en tiempo de compilación.

Objective-C dispone de las siguientes funcionalidades clave:
Dynamic dispatch

Los lenguajes orientados a objetos, re-emplazan las llamadas a las funciones por mensajes. La diferencia es que un mismo mensaje, puede ejecutar distinto código en tiempo de ejecución. Esto es, distintas clases pueden implementar el mismo método, pero en una clase puede hacer una cosa y en en otra puede realizar algo totalmente diferente. Es decir, el mismo mensaje, disparará una secuencia de acciones según quien lo reciba. Objective-C decide dinámicamente en tiempo de ejecución que código se ejecutará buscando la clase que lo recibe y sus antecesores. El compilador de C++ construye estáticamente una tabla virtual en tiempo de compilación que mapea un mensaje por método y por clase concreta.

¿Que ventaja ofrece esto frente a C++? pues que en tiempo de ejecución la jerarquía de herencia puede ser cambiada en tiempo de ejecución.

Dynamic typing

Puesto que el procedimiento de envío de mensajes es dinámico, en Objective-C se pueden enviar mensajes a objetos cuyo tipo no se ha declarado. En tiempo de ejecución se determina la clase del receptor del mensaje y ejecuta el código apropiado. C++, requiere que el tipo del receptor sea declarado estáticamente en tiempo de compilación para consultar su "dispatch table".

El desarrollador debe llevar cuidado con el tipado dinámico, pues puede que su programa compile, pero luego tenga errores cuando lo ejecute.

Dynamic loading

Gracias al "dynamic dispatch" es fácil dejar para el tiempo de ejecución el enlace de modulos externos compilados. Se puede dividir un programa en módulos que pueden ser cargados y descargados en tiempo de ejecución según se necesiten. Esto facilita la distribución de código, incluso sobre una red o permite hacer aplicaciones que soporten plugins.

Tras esta teórica introducción, en el próximo capítulo, introduciré el famoso "Hola mundo" en Objective-C.

Presentación

Buenas,

Introduzco este blog que ya creé hace unos meses. Con él, tengo la intención de mostrar como programar con el Framework Cocoa de Apple. Este conjunto de librerías desarrolladas con Objective-C, son las que se usan para desarrollar aplicaciones para Mac OSX e iOS (iPhone/iPod Touch/iPad).

Los próximos posts tratarán sobretodo el lenguaje Objective-C. Este lenguaje añade características de programación orientada a objetos al lenguaje C. Muchos conoceréis C++, que ya es orientado a objetos, entonces ¿para que Objective-C? ¿Que diferencia hay? En próximas entradas lo comentaré.

Para concluír, como desarrollador Java que soy, muchas veces compararé un lenguaje con otro, muy útil para los que como yo venís del mundo Java.

Espero disfrutéis del blog.