0% encontró este documento útil (0 votos)
92 vistas20 páginas

Object C

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
92 vistas20 páginas

Object C

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 20

Objective-C

Curso práctico para


desarrolladores
OS X y iOS

Fernando López Hernández


Objective-C. Curso práctico para desarrolladores OS X y iOS
Fernando López Hernández

ISBN: 978-84-943055-3-5
EAN: 9788494305535
IBIC: UM

Copyright © 2015 RC Libros


© RC Libros es un sello y marca comercial registrados

Objective-C. Curso práctico para desarrolladores OS X y iOS.


Reservados todos los derechos. Ninguna parte de este libro incluida la cubierta puede ser
reproducida, su contenido está protegido por la Ley vigente que establece penas de prisión
y/o multas a quienes intencionadamente reprodujeren o plagiaren, en todo o en parte, una
obra literaria, artística o científica, o su transformación, interpretación o ejecución en
cualquier tipo de soporte existente o de próxima invención, sin autorización previa y por
escrito de los titulares de los derechos de la propiedad intelectual.

RC Libros, el Autor, y cualquier persona o empresa participante en la redacción, edición o producción de este libro, en
ningún caso serán responsables de los resultados del uso de su contenido, ni de cualquier violación de patentes o
derechos de terceras partes. El objetivo de la obra es proporcionar al lector conocimientos precisos y acreditados sobre el
tema tratado pero su venta no supone ninguna forma de asistencia legal, administrativa ni de ningún otro tipo, si se
precisase ayuda adicional o experta deberán buscarse los servicios de profesionales competentes. Productos y marcas
citados en su contenido estén o no registrados, pertenecen a sus respectivos propietarios.

RC Libros
Calle Mar Mediterráneo, 2. Nave 6
28830 SAN FERNANDO DE HENARES, Madrid
Teléfono: +34 91 677 57 22
Fax: +34 91 677 57 22
Correo electrónico: [email protected]
Internet: www.rclibros.es

Diseño de colección, cubierta y pre-impresión: Grupo RC


Impresión y encuadernación:
Depósito Legal: M-34246-2014
Impreso en España

19 18 17 16 15 (1 2 3 4 5 6 7 8 9 10 11 12)
PREFACIO

Cuando Steve Jobs abandonó Apple, creó una empresa llamada NeXT. El objetivo
de NeXT era crear un sistema operativo técnicamente superior a los que entonces
existían en el mercado, al que llamaron NeXTSTEP. Objective-C es el lenguaje que
eligió la empresa NeXT para su sistema operativo. Apple compró NeXTSTEP cuando
Steve Jobs volvió a Apple, y ha conservado el lenguaje Objective-C como lenguaje
principal para el desarrollo de aplicaciones.

Apple ha evolucionado el antiguo sistema operativo NeXTSTEP para cubrir dos


áreas de mercado. La primera área es Mac OS X, el sistema operativo para
ordenadores de escritorio, como son los portátiles MacBook o los ordenadores de
mesa Mac mini, iMac o Mac Pro. La segunda área es iOS, el sistema operativo para
dispositivos móviles de Apple tales como iPhone, iPad o Apple TV. Mac OS X y iOS
comparten un modelo de programación fuertemente orientado a objetos, y que
utiliza como base el lenguaje de programación Objective-C.

La documentación técnica de Apple está dejando de referirse al dispositivo


iPhone, iPad para utilizar el nombre del sistema operativo iOS. Mi anterior libro
titulado "Objective-C. Curso Práctico para Programadores Mac OS X, iPhone y iPad. 2ª
Edición" todavía sigue siendo útil para aprender Objective-C, pero estos cambios,
unidos a las novedades del lenguaje han hecho conveniente actualizar y modernizar
el título de esta tercera edición.
OBJECTIVE-C. CURSO PRÁCTICO PARA DESARROLLADORES OS X Y iOS

Objective-C 2.0 es una extensión a Objective-C para proporcionar nuevas


características. Normalmente, este libro utiliza el término Objective-C para referirse
tanto a las características originales como a estas nuevas características.

La similitud que existe entre Mac OS X y iOS hace posible escribir programas que
compilan en ambas plataformas. Este libro aprovecha esta similitud para enseñar a
programar en Objective-C, y recalca los puntos donde la forma de programar ambos
sistemas operativos difiere.

La experiencia del autor de este libro dice que Objective-C no es un lenguaje que
se suela escoger como primer lenguaje de programación. Lenguajes como C++ o Java
son los lenguajes más elegidos por los recién llegados al mundo de la programación.
Los programadores que se interesan por el desarrollo de aplicaciones Mac OS X o iOS
suelen ser profesionales de la programación con experiencia en el desarrollo de
aplicaciones en otros entornos. La entrada de Apple en el mundo de los sistemas
operativos móviles ha incrementado significativamente la llegada de este tipo de
profesionales.

Esta observación hace posible diseñar un libro adaptado a programadores que ya


conocen los conceptos básicos comunes a todos los lenguajes de programación, y
que no quieren dedicar su tiempo a volver a leer otro libro de introducción a la
programación. Este libro está pensado para que estos programadores aprendan a
desarrollar aplicaciones Mac OS X o iOS rápidamente. Para facilitar aún más el
aprendizaje, este libro también incluye comparaciones entre aspectos Objective-C y
la forma en que estos aspectos se implementan en C++ y en Java. Creemos que esta
forma de aprendizaje ágil animará a muchos programadores a elegir este libro como
su libro de referencia para introducirse en el apasionante mundo de la manzana.

Qué contiene este libro


Este libro tiene dos partes. La primera parte estudia en detalle el lenguaje
Objective-C. El lenguaje es la base para poder empezar a estudiar la extensa librería
de clases y funciones que proporcionan tanto Mac OS X como iOS.

La segunda parte del libro estudia Foundation Framework, una librería con el
conjunto de funciones y clases básicas que comparten Mac OS X y iOS. Foundation
Framework proporciona funcionalidad para el manejo de ficheros, los procesos e
hilos, el runtime de configuración sistema, la programación multihilo y sus técnicas
de sincronización, la programación en red y los objetos distribuidos. Foundation
Framework también se basa en otra librería llamada Core Foundation, que también
se estudia en este libro.
XX © RC Libros
PREFACIO

Conocer la librería Foundation Framework es una inestimable ayuda antes de


afrontar el aprendizaje del extenso grupo de librerías que proporciona Mac OS X o
iOS. Cocoa es el nombre que agrupa a las librerías de programación propias de Mac
OS X. Cocoa Touch es el nombre que agrupa a las librerías para desarrollar
aplicaciones para iOS.

Al acabar este libro, el lector conocerá todos los detalles del lenguaje Objective-
C, y tendrá una base sólida sobre el manejo de la librería Foundation Framework. En
este momento, cada programador tendrá que decidir si sus objetivos profesionales le
exigen centrarse en estudiar las librerías de Mac OS X, o las de iOS.

Acerca del autor


El autor de este libro es un entusiasta del mundo de la programación Apple. Su
interés despertó cuando en el año 2000 Apple sacó al mercado la primera versión de
su sistema operativo Mac OS X. En febrero de 2001, inició el sitio web
MacProgramadores.org donde ha moderado foros, publicado numerosos tutoriales,
reportajes, trucos y noticias relacionados con la programación de Mac OS X. Con la
llegada de iPhone añadió la programación de iOS.

Fernando López Hernández nació en 1973, tiene el título de Doctor Europeo en


Ingeniería Informática y Telecomunicación. Actualmente trabaja como investigador
sénior y profesor universitario para UNIR (Universidad Internacional de La Rioja) en
asignaturas del Grado en Ingeniería Informática y en el Máster Universitario de
Desarrollo de Aplicaciones Móviles, que dirige. Profesionalmente ha trabajado en
diversos laboratorios de investigación en España, Reino Unido y Austria, ha trabajado
en varios proyectos de investigación financiados por la Unión Europea, y tiene un
considerable número de publicaciones científicas.

Para que el lector pueda consultar sus dudas y reportar posibles erratas, el autor
ha habilitado un foro en http://www.macprogramadores.org/?q=forum.

Agradecimientos personales
Este libro ha llegado a ser una realidad con el apoyo de dos personas. Una de
ellas ha sido Carolina Fernández Arias, mi mujer, que no solo ha prescindido de mí
mientras lo escribía, sino que ha revisado el texto de este libro en busca de mejoras.
La otra persona ha sido Alberto Corbi Bellot, mi amigo y compañero de admiración
por las tecnologías Apple. Muchas de las nuevas características de las herramientas
de desarrollo no estarían descritas en este libro sin su revisión.

© RC Libros XXI
PARTE I:

EL LENGUAJE
OBJECTIVE-C
EMPEZANDO A
PROGRAMAR CON
OBJECTIVE-C

OBJETIVOS DEL CAPÍTULO

Este primer capítulo de naturaleza introductoria empieza describiendo los


entornos donde podemos programar con Objective-C, y después describe las
herramientas necesarias para crear aplicaciones.

Antes de que en el Capítulo 2 se adentre en los conceptos del lenguaje, creemos


que será útil para el lector familiarizarse con el uso de las herramientas de
programación. Con este fin, este capítulo empieza enseñando al lector cómo crear
sencillos programas, y describe la forma de compilar y enlazar estas aplicaciones.

El capítulo empieza describiendo cómo compilar aplicaciones Objective-C desde la


consola, utilizando Clang y las herramientas de programación de GNU. La segunda
parte del capítulo muestra cómo la herramienta gráfica Xcode mejora la
productividad del programador.

ENTORNOS DE PROGRAMACIÓN

Objective-C procede de los tiempos de NeXTSTEP, el sistema operativo en el que


se basa Mac OS X. A su vez iOS es una evolución de Mac OS X para adaptarlo a
dispositivos móviles. iOS es el nombre que Apple ha dado al sistema operativo de
dispositivos como iPhone, iPad, iPod Touch y Apple TV. Objective-C es el lenguaje
principal y nativo para desarrollo de aplicaciones en todos estos sistemas operativos.

Una vez que el programador de aplicaciones Mac OS X o iOS aprende el lenguaje


Objective-C, su siguiente paso será empezar a conocer la extensa librería de clases y
funciones que proporcionan estos sistemas operativos. Estas librerías se pueden
dividir, grosso modo, en tres grandes grupos:

• Foundation Framework. Son un conjunto de clases de utilidad que permiten


representar estructuras de datos complejas (arrays, listas, diccionarios, etc.).
OBJECTIVE-C. CURSO PRÁCTICO PARA DESARROLLADORES OS X Y iOS

Estas clases también incluyen otras funcionalidades como el acceso a red, la


gestión de procesos e hilos, el runtime de configuración del sistema, la
programación multihilo y las técnicas para sincronizar estos hilos. La principal
característica de estas clases es que, en su mayoría, son comunes a Mac OS X y
iOS. Esto se debe a que no incluyen las clases relacionadas con la parte que más
cambia: la interfaz gráfica de usuario.
• Cocoa. Aquí se incluyen las clases propias de Mac OS X. Estas clases están
relacionadas con la interfaz gráfica, la impresión, el acceso a audio y vídeo, y
todos los demás servicios que proporciona Mac OS X. Tradicionalmente, Apple
también ha utilizado el término Aplicación Kit Framework (AppKit Framework)
para referirse a estas clases. Dentro del Cocoa encontramos otros kits de
desarrollo especializados en determinadas tareas como puedan ser Image Kit,
QuickTime Kit, Apple Scripting Kit, etc.
• Cocoa Touch. Aquí se incluyen las clases propias de la interfaz de usuario de iOS.
Las clases de Cocoa están pensadas para manejar aplicaciones mediante un
teclado y un ratón, con lo que Apple tuvo que crear un conjunto de librerías
distintas, llamado Cocoa Touch, para poder manejar dispositivos táctiles. La
principal librería que encontramos en Cocoa Touch es UI Kit, el kit que permite
desarrollar los elementos de la interfaz gráfica de las aplicaciones iOS. Otros kits
que encontramos son, por ejemplo, Map Kit para gestionar mapas Google, iAd Kit
para gestionar los banners de publicidad, Game Kit para juegos o Audio Unit Kit
para gestionar el sonido.

La Figura 1.1 muestra un resumen de las capas software de programación tanto


de Mac OS X como de iOS. Observe que las partes de más alto nivel son
programables en Objective-C, mientras que el bajo nivel (Core Services) se programa
en C. Esta organización permite alcanzar mayor productividad a los programadores
de alto nivel mediante el uso de la programación orientada a objetos. Como se
explicará en el Capítulo 2, Objective-C es una extensión de C para aprovechar las
ventajas de la programación orientada a objetos. Observe que hay librerías
Objective-C (por ejemplo, Quick Time Kit o Foundation Framework) que tienen su
correspondiente librería C (QuickTime y Core Foundation, en el ejemplo anterior). En
este caso, las llamadas a las librerías Objective-C suelen estar mapeadas
directamente; es decir, envuelven a su correspondiente llamada a librería C.

Otra API no mostrada en esa figura es Carbon, la antigua API de programación de


Mac OS Classic (Mac OS 9 e inferiores). Carbon es un API programable en C y de
transición, que Mac OS X integra para mantener compatibilidad con aplicaciones
antiguas. El fin último de Carbon es desaparecer, y de hecho, iOS ya no incluye esta
API.

4 © RC Libros
CAPÍTULO 1: EMPEZANDO A PROGRAMAR CON OBJECTIVE-C

Figura 1.1: Capas software de programación en Mac OS X y iOS

En este libro vamos a centrarnos en estudiar el lenguaje Objective-C. También


estudiaremos algunas clases de Foundation Framework. Las clases de Cocoa y Cocoa
Touch se dejan para otros libros que usted podrá leer, una vez que domine el
lenguaje.

COMPILANDO CON LAS GCC

Las GCC (GNU Compiler Collection) son un conjunto de herramientas que


proporciona GNU para programar en varios lenguajes y plataformas. Mac OS X y iOS
se apoyan en estas herramientas para realizar las tareas de compilación y enlazado
de sus aplicaciones.

Para mejorar la productividad y la facilidad de uso de estas herramientas, Apple


creó Xcode, un IDE (Integrated Development Environment) que permite realizar de
forma gráfica las tareas comunes de programación. Xcode hace llamadas a las GCC
para realizar las tareas de compilación y enlazado de forma transparente al
programador.

© RC Libros 5
OBJECTIVE-C. CURSO PRÁCTICO PARA DESARROLLADORES OS X Y iOS

En esta sección veremos cómo utilizar las herramientas de programación de GNU


para compilar y enlazar aplicaciones Objective-C desde el terminal1. Al final del
capítulo veremos cómo se puede utilizar Xcode para mejorar la productividad del
programador. Para poder usar las herramientas de programación de GNU asegúrese
de haber instalado Xcode, incluyendo el paquete Xcode Command Line Tools.

En este capítulo vamos a pasar por encima los detalles relativos al lenguaje, con
lo que si no conoce Objective-C puede que muchos aspectos de lenguaje queden sin
explicar. En el Capítulo 2 introduciremos el lenguaje a nivel conceptual, y en el
Capítulo 3 empezaremos a detallar todos los aspectos del lenguaje con el nivel de
detalle que se requiere para su correcta comprensión.

Crear un ejecutable
Debido a que Objective-C es una extensión al lenguaje C, un programa C compila
en Objective-C sin necesidad de cambios. El Listado 1.1 muestra un programa básico
Objective-C que solo usa la sintaxis de C, excepto por dos aspectos:

/* holamundo.m */
#import <stdio.h>
#import <stdlib.h>

int main() {
printf(“Hola desde Objective-C\n”);
return EXIT_SUCCESS;
}

Listado 1.1: Programa Objective-C básico

El primer aspecto es que, en vez de usar la directiva del preprocesador #include,


hemos usado la directiva del preprocesador #import. Ambas directivas incluyen un
fichero dentro de otro fichero, pero a diferencia de #include, la directiva #import
asegura que el fichero incluido no se incluya más de una vez. En consecuencia, en los
ficheros de cabecera incluidos con #import no es necesario hacer un control de
inclusiones con la directiva del preprocesador #ifdef, tal como acostumbra a
hacerse en C y C++.

1
Si, al final de este capítulo, cree que todavía no conoce lo suficiente estas herramientas,
encontrará una descripción a fondo de estas herramientas en el tutorial "Compilar y depurar
aplicaciones con las herramientas de programación GNU", publicado online en
MacProgramadores.org.
6 © RC Libros
CAPÍTULO 1: EMPEZANDO A PROGRAMAR CON OBJECTIVE-C

La segunda diferencia está en que la extensión de los ficheros Objective-C es .m.


Esta es la extensión que permite al comando clang saber que se trata de un
programa Objective-C.

Para compilar y ejecutar este programa, bastaría con ejecutar los siguientes
comandos:

$ clang holamundo.m -o holamundo


$ ./holamundo
Hola desde Objective-C

Frameworks de Objective-C
Para programar en Objective-C disponemos de dos frameworks distintos: el
primer framework es el framework de clases de GNU, que son un conjunto de clases
inicialmente desarrollado por NeXTSTEP para Objective-C, que fueron abiertas bajo
licencia GNU, y cuya clase base es la clase Object. El segundo es el framework de
clases de NeXTSTEP, que es el conjunto de clases que desarrolló NeXTSTEP en 1994,
cuya clase base es NSObject, y que actualmente es el usado por Mac OS X y iOS para
implementar Cocoa y Cocoa Touch. Apple no ha abierto el código fuente del
framework de clases de NeXTSTEP.

Actualmente, el framework de clases de GNU ha dejado de actualizarse, y GNU


también está haciendo una implementación de código fuente abierto del nuevo
framework de clases de NeXTSTEP, llamado GNUStep. Esta implementación también
utiliza la clase base NSObject, así como el resto de clases del framework de
NeXTSTEP, pero aún no está terminada.

Para usar el framework de clases de GNU, debemos enlazar con el fichero


libobjc.a usando la opción del enlazador -lobjc. Por el contrario, para enlazar con
el framework de clases de NeXTSTEP debemos enlazar con el framework
Foundation.framework usando la opción del enlazador -framework Foundation.
Lógicamente, podemos enlazar con ambos frameworks de clases, proporcionando
ambas opciones durante el enlazado.

Programar con el viejo framework de clases de GNU


En esta sección, vamos a ver cómo programar usando el framework de clases de
GNU. En la siguiente sección, veremos las diferencias cuando usamos el framework
de clases de NeXTSTEP.

© RC Libros 7
OBJECTIVE-C. CURSO PRÁCTICO PARA DESARROLLADORES OS X Y iOS

Normalmente, cada clase Objective-C consta de dos ficheros: uno con la


extensión .h que contiene la interfaz, y otro con la extensión .m que contiene la
implementación. El Listado 1.2 y el Listado 1.3 muestran, respectivamente, un
ejemplo de interfaz e implementación de una clase Objective-C llamada Saludador.
Observe que estamos usando como clase base la clase Object situada en el fichero
de cabecera <objc/Object.h>.

/* Saludador.h */
#import <objc/Object.h>

@interface Saludador : Object {


char* saludo;
}
• init;
- (void)setSaludo:(char*)unSaludo;
- (void)setSaludo:(char*)unSaludo y:(char*)unaColetilla;
- (void)saluda;
@end

Listado 1.2: Interfaz de una clase Objective-C con el framework de clases de GNU

/* Saludador.m */
#import “Saludador.h”
#import <stdio.h>
#import <stdlib.h>
#import <string.h>

@implementation Saludador
• init {
if ((self = [super init])) {
saludo = “Hola mundo”;
}
return self;
}
- (void)setSaludo:(char*)unSaludo {
saludo = unSaludo;
}
- (void)setSaludo:(char*)unSaludo y:(char*)unaColetilla {
saludo = malloc(strlen(unSaludo)+strlen(unaColetilla)+1);
strcpy(saludo,unSaludo);
strcat(saludo,unaColetilla);
}
- (void)saluda {
printf(“%s\n”,saludo);
}
@end

Listado 1.3: Implementación de una clase Objective-C con el framework de clases de GNU

8 © RC Libros
CAPÍTULO 1: EMPEZANDO A PROGRAMAR CON OBJECTIVE-C

Una vez tengamos definida la clase, para instanciar y usar un objeto de esta
clase, necesitamos un programa principal como el del Listado 1.4.

/* pidesaludo.m */
#import <stdlib.h>
#import “Saludador.h”

int main() {
Saludador* s = [[Saludador alloc] init];
[s saluda];
[s setSaludo: “Hola de nuevo”];
[s saluda];
[s setSaludo: “Hola buenos dias,”
y: “encantado de verle”];
[s saluda];
[s free];
return EXIT_SUCCESS;
}

Listado 1.4: Programa que usa un objeto Objective-C del framework de clases de GNU

Al estar usando el framework de clases de GNU, el programa puede ser


compilado y enlazado con los siguientes comandos:

$ clang –arch i386 -c Saludador.m


$ clang –arch i386 -c pidesaludo.m
$ clang –arch i386 Saludador.o pidesaludo.o –lobjc -o pidesaludo

O bien realizar los tres pasos a la vez con el siguiente comando:

$ clang –arch i386 pidesaludo.m Saludador.m –lobjc -o pidesaludo

Por último, lo ejecutamos con el comando:

$ ./pidesaludo

Observe que hemos ejecutado clang con la opción –arch i386. Esto se debe a
que Apple ha dejado de mantener este conjunto de clases, las cuales no compilan en
64 bits (x86_64), que es la arquitectura por defecto desde Mac OS X 10.6. Es decir, si
no indicamos opción, por defecto Mac OS X usaría la opción -arch x86_64. Para usar
el framework de clases de GNU, tenemos que compilar para una plataforma en la
que se soporte. En concreto, el framework de clases de GNU está soportado en i386
(Intel de 32 bits) y ppc970 (PowerPC). Las arquitecturas armv6, armv7, armv7s y
arm64 de iOS y ppc64 (PowerPC de 64 bits) tampoco soportan el framework de clases
de GNU. Dado que Apple ha dejado de dar soporte al framework de clases de GNU,

© RC Libros 9
OBJECTIVE-C. CURSO PRÁCTICO PARA DESARROLLADORES OS X Y iOS

en el resto de este libro nos vamos a limitar a estudiar el framework de clases de


NeXTSTEP.

Programar con el framework de clases de NeXTSTEP


El Listado 1.5, el Listado 1.6 y el Listado 1.7 muestran cómo implementar y usar
la clase Saludador de la sección anterior, pero enlazando con el framework de clases
de NeXTSTEP. La principal diferencia está en que ahora derivamos de NSObject, en
vez de derivar de Object. Una segunda diferencia está en que importamos el fichero
<Foundation/NSObject.h>, en vez de importar el fichero <objc/Object.h>. La
tercera diferencia está en que la clase NSObject proporciona el método release
para decrementar la cuenta de referencias y liberar la memoria dinámica de un
objeto, mientras que la clase Object de GNU proporciona otro método equivalente
llamado free. En el Listado 1.7 vemos como ahora se usa release.

/* Saludador.h */
#import <Foundation/NSObject.h>

@interface Saludador : NSObject {


char* saludo;
}
• init;
- (void)setSaludo:(char*)unSaludo;
- (void)setSaludo:(char*)unSaludo y:(char*)unaColetilla;
- (void)saluda;
@end

Listado 1.5: Interfaz de una clase Objective-C con el framework de clases de NeXTSTEP

/* Saludador.m */
#import “Saludador.h”
#import <stdio.h>
#import <stdlib.h>
#import <string.h>

@implementation Saludador
• init {
if ((self = [super init])) {
saludo = “Hola mundo”;
}
return self;
}
- (void)setSaludo:(char*)unSaludo {
saludo = unSaludo;
}
- (void)setSaludo:(char*)unSaludo y:(char*)unaColetilla {
saludo = malloc(strlen(unSaludo)+strlen(unaColetilla)+1);
strcpy(saludo,unSaludo);

10 © RC Libros
CAPÍTULO 1: EMPEZANDO A PROGRAMAR CON OBJECTIVE-C

strcat(saludo,unaColetilla);
}
- (void)saluda {
printf(“%s\n”,saludo);
}
@end

Listado 1.6: Implementación de una clase Objective-C con el framework de clases de NeXTSTEP

/* pidesaludo.m */
#import <stdlib.h>
#import “Saludador.h”

int main() {
Saludador* s = [[Saludador alloc] init];
[s saluda];
[s setSaludo: “Hola de nuevo”];
[s saluda];
[s setSaludo: “Hola buenos dias,”
y: “encantado de verle”];
[s saluda];
[s release];
return EXIT_SUCCESS;
}

Listado 1.7: Programa que usa un objeto Objective-C con el framework de clases de NeXTSTEP

Ahora, para compilar y ejecutar el programa usamos los siguientes comandos:

$ clang Saludador.m pidesaludo.m -framework Foundation -o pidesaludo


$ ./pidesaludo

CLANG, LLVM Y LLDB

El compilador de GCC consta de un front-end y de varios back-ends. El back-end


permite generar instrucciones en los distintos lenguajes y arquitecturas. El front-end
de GCC es el comando clang, y las distintas opciones de línea de comandos que
soporta.

LLVM (Low-Level Virtual Machine) es un nuevo conjunto de back-ends para


distintos lenguajes y arquitecturas que presenta varias ventajas técnicas respecto a
los back-ends tradicionales de GCC.

En 2005, Apple contrató a miembros del equipo de desarrollo de LLVM para


trabajar en mejorar estos back-ends. La idea inicial era mantener el front-end de GCC
y reemplazar sus back-ends. LLVM-GCC es el nombre que recibió este proyecto.

© RC Libros 11
OBJECTIVE-C. CURSO PRÁCTICO PARA DESARROLLADORES OS X Y iOS

El intento de combinar LLVM con GCC dio lugar a varios problemas:

• Apple usa principalmente Objective-C, pero el lenguaje Objective-C tiene poca


prioridad para los desarrolladores de GCC.
• El front-end de GCC no se integra bien con las funcionalidades interactivas que
los ingenieros de Apple querían meter en Xcode.
• Apple no está de acuerdo con algunas restricciones de patentes que introduce la
licencia GPLv3, bajo la que se distribuye GCC 4.3.

Estos problemas hicieron que en 2007 Apple decidiera escribir un nuevo front-
end al que llamaron Clang. Clang es un front-end que es en gran parte similar al
front- end de GCC. El comando que lo implementa es clang y es una alternativa al
comando gcc de las GCC. Algunas diferencias entre ellos son:

• La mayoría de las opciones del comando clang son similares a las del comando
gcc. Con el tiempo, es posible que estas opciones diverjan cada vez más.
• Clang solo soporta los lenguajes C99, C++0x, C++ y Objective-C. GCC, además de
estos lenguajes, soporta Java, Fortran y Ada.
• Clang y LLVM se distribuyen bajo la licencia abierta de la Universidad de Illinois.
GCC se distribuye bajo licencia GNU. La licencia abierta de la Universidad de
Illinois es parecida a la licencia BSD, en el sentido de que no exige distribuir el
código fuente con las modificaciones que se hagan al compilador.

Aunque Apple sigue distribuyendo el comando llvm-gcc, el objetivo es que en el


futuro solo se use el comando clang. GCC 4.2.1 es la última versión de GCC con
licencia GPLv2, y posiblemente la última versión de GCC que incluyan las
herramientas de desarrollo de Apple.

Las principales ventajas que indica Apple para el front-end Clang frente a GCC
son:

• Durante el proceso de compilación, Clang mantiene más información sobre el


código fuente original que GCC. Esto permite mapear más fácilmente los errores
en el código fuente.
• Clang dispone de un analizador de código estático que permite encontrar
errores comunes de programación que GCC no encontraba.
• Clang permite una compilación incremental más sencilla y eficiente, la cual se
puede usar para reducir el tiempo de compilación de Xcode cuando se hacen
pequeños cambios en el código fuente. Por su parte, aunque GCC soporta la
compilación incremental, está pensado para seguir un ciclo más tradicional,
basado en compilar-enlazar-ejecutar.

12 © RC Libros
CAPÍTULO 1: EMPEZANDO A PROGRAMAR CON OBJECTIVE-C

• Clang permite indexar los símbolos del código fuente. Estos símbolos son usados
por Xcode para facilitar al usuario la navegación por el código fuente.
• Clang permite compilar en varios hilos paralelos, reduciendo el tiempo de
compilación en máquinas multi-core.

Las principales ventajas que indican los desarrolladores de GCC frente a Clang
son:

• GCC soporta los lenguajes Java, Fortran y Ada, que Clang no soporta.
• En tests realizados en 2011, aunque Clang compila más rápido que GCC, GCC
genera código más optimizado que Clang.

El proyecto LLVM fue iniciado en la Universidad de Illinois bajo la dirección de


Vikram Adve y Chris Lattner. En 2005, Apple contrató a Chris Lattner como líder del
equipo de desarrollo de LLVM.

La principal novedad de LLVM, frente a los back-ends de GCC, es que genera una
representación intermedia llamada IF (Intermediate Form). Esta representación
intermedia permite obtener errores y warnings más precisos, y optimizar más
fácilmente el código fuente. Durante la fase de enlazado, esta representación
intermedia se convierte en instrucciones del ensamblador para la máquina destino.

LLVM se distribuye con un nuevo depurador llamado lldb. El comando lldb es


similar al comando gdb2 de GCC, pero permite aprovechar mejor la información que
genera LLVM3.

Compilando con Clang


Hasta Xcode 5 era posible elegir entre usar Clang o GCC para compilar
aplicaciones Mac OS X, aunque el front-end por defecto era Clang. Xcode 6 eliminó
GCC de los proyectos, pero se sigue distribuyendo como parte de las Xcode
Command Line Tools. En esta sección vamos a ver cómo se usa Clang para compilar
aplicaciones. También veremos que las opciones de línea de comando de clang son

2
A partir de Xcode 5 gdb ya no se distribuye con las Xcode Command Line Tools, solo se
distribuye el comando lldb.
3
El comando lldb se encuentra en la ruta /Developer/usr/bin/lldb. Si quiere usar este
comando desde el terminal, deberá añadir su directorio al PATH.
© RC Libros 13
OBJECTIVE-C. CURSO PRÁCTICO PARA DESARROLLADORES OS X Y iOS

muy parecidas a las de gcc. En el resto de este libro usaremos clang para compilar
nuestras aplicaciones.

Para compilar el ejemplo del Listado 1.1 con Clang, en vez de hacer:

$ gcc holamundo.m -o holamundo

Hacemos:

$ clang holamundo.m -o holamundo

Análogamente, el ejemplo del Listado 1.2, del Listado 1.3 y del Listado 1.4 se
compilaría con el siguiente comando:

$ clang pidesaludo.m Saludador.m -lobjc -arch i386 -o pidesaludo

O el ejemplo del Listado 1.5, del Listado 1.6 y del Listado 1.7 con el siguiente
comando:

$ clang Saludador.m pidesaludo.m -framework Foundation -o pidesaludo

Observando el Listado 1.6 vemos que la necesidad de enlazar con el framework


Foundation ya está indicada en la directiva del compilador:

#import <Foundation/NSObject.h>

A partir de Xcode 5 podemos usar el flag -fmodules para activar los llamados
módulos. Estos indican al compilador que deduzca automáticamente los frameworks
con lo que tiene que enlazar en función de las directivas #import. Es decir, el
comando anterior también lo podríamos haber escrito como:

$ clang Saludador.m pidesaludo.m -fmodules -o pidesaludo

Crear una librería estática o dinámica


Al igual que con C o C++, con Objective-C también podemos crear una librería de
enlace estático o dinámico, que luego usemos desde otros programas. La librería de
enlace estático es aquella en la que su código se inserta en el ejecutable durante la
compilación. La librería de enlace dinámico es aquella en la que su código no forma
parte del ejecutable, sino que se mantiene en otro fichero al que el ejecutable
accede durante la ejecución del programa. Para crear una librería de enlace estático

14 © RC Libros
CAPÍTULO 1: EMPEZANDO A PROGRAMAR CON OBJECTIVE-C

que incluya la clase Saludador del Listado 1.6, podemos generar el fichero de librería
con el siguiente comando:

$ ar -r libsaludos.a Saludador.o
ar: creating archive libsaludos.a

Una vez creada la librería de enlace estático, podemos enlazar con ella desde el
programa del Listado 1.7 ejecutando el siguiente comando:

$ clang pidesaludo.m libsaludos.a -framework Foundation -o pidesaludo

Lógicamente, también podemos hacerlo con el flag -fmodules:

$ clang pidesaludo.m libsaludos.a -fmodule -o pidesaludo

Si lo que queremos es crear una librería de enlace dinámico, podemos crear la


librería de enlace dinámico, y enlazar el programa principal del Listado 1.7 con la
librería, ejecutando los siguientes comandos:

$ clang -dynamiclib Saludador.o -framework Foundation -o


libSaludos.dylib
$ clang pidesaludo.m libSaludos.dylib -framework Foundation -o
pidesaludo

Compilación cruzada para iOS


Aunque los programas anteriores compilan directamente para Mac OS X, si
queremos compilar este programa para iOS, necesitaremos conocer más a fondo
Clang.

Ya hemos visto que la opción -arch permite indicar la plataforma para la que
queremos generar el binario. Actualmente, iOS soporta varias opciones:

• armv6 para iPhone 3G e inferiores.


• armv7 para iPad y iPhone 3GS y superiores.
• armv7s para iPad 4G y iPhone 5c y superiores
• arm64 para iPhone 5s y superiores

© RC Libros 15
OBJECTIVE-C. CURSO PRÁCTICO PARA DESARROLLADORES OS X Y iOS

Xcode 5 ha dejado de aceptar la opción armv6,


con lo que la opción que nos garantiza mayor
compatibilidad con dispositivos es armv7. Si
nuestra aplicación es solo para dispositivos
modernos podemos usar la opción armv7s o
arm64 para que el compilador genere nuevas
instrucciones máquina que mejoran el
rendimiento.

Sin embargo, indicar la arquitectura no es


suficiente para que Clang genere una aplicación
que pueda ejecutar en iOS. Las diferencias entre
Mac OS X y iOS son suficientes como para que
Apple haya decidido crear diferentes versiones
de sus herramientas de desarrollo, una por cada
plataforma. En concreto, estas plataformas de
desarrollo (que se muestran en la Figura 1.2) son:

• iPhoneOS.platform es la plataforma de
desarrollo para generar binarios para los
procesadores ARM. Estos binarios se generan
preparados para enlazar con las librerías de Figura 1.2: Plataformas de desarrollo
enlace dinámico del dispositivo.
• iPhoneSimulator.platform es la plataforma para desarrollar aplicaciones que
ejecutan en iPhone Simulator. Se diferencia de la anterior en que el binario
contiene instrucciones Intel, y enlaza con las librerías de enlace dinámico del
simulador.
• MacOSX.platform es la plataforma por defecto. Genera binarios Intel que
enlazan con las librerías de enlace dinámico del sistema operativo Mac OS X.

Si queremos generar una aplicación iOS, debemos cambiar de plataforma de


desarrollo, lo cual se suele hacer declarando la variable de entorno DEVROOT de la
siguiente forma:

$ export DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/
iPhoneOS.platform/Developer

Una plataforma de desarrollo puede tener más de un SDK (Software


Development Kit). Luego, además de la plataforma de desarrollo, debemos indicar
con qué SDK queremos trabajar, declarando la variable de entorno SDKROOT de la
siguiente forma:

16 © RC Libros

También podría gustarte