Lenguaje Objective C
Lenguaje Objective C
ISBN: 978-84-939450-8-4
EAN: 9788493945084
BIC: UMQ; UMS
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
17 16 15 14 13 (1 2 3 4 5 6 7 8 9 10 11 12)
PARTE I:
EL LENGUAJE
OBJECTIVE-C
EMPEZANDO A
PROGRAMAR CON
OBJECTIVE-C
ENTORNOS DE PROGRAMACIÓN
4 © RC Libros
CAPÍTULO 1: EMPEZANDO A PROGRAMAR CON OBJECTIVE-C
© RC Libros 5
OBJECTIVE-C. CURSO PRÁCTICO PARA PROGRAMADORES MAC OS X, IPHONE Y IPAD
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 le resulten
confusos. 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;
}
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
Para compilar y ejecutar este programa, bastaría con ejecutar los siguientes
comandos:
© RC Libros 7
OBJECTIVE-C. CURSO PRÁCTICO PARA PROGRAMADORES MAC OS X, IPHONE Y IPAD
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>
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 {
8 © RC Libros
CAPÍTULO 1: EMPEZANDO A PROGRAMAR CON OBJECTIVE-C
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
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
$ gcc -c Saludador.m
$ gcc -c pidesaludo.m
$ gcc Saludador.o pidesaludo.o –lobjc –arch i386 -o pidesaludo
Observe que hemos ejecutado gcc 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. Para usar el
© RC Libros 9
OBJECTIVE-C. CURSO PRÁCTICO PARA PROGRAMADORES MAC OS X, IPHONE Y IPAD
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 y armv7 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, en el resto de este
libro nos vamos a limitar a estudiar el framework de clases de NeXTSTEP.
/* Saludador.h */
#import <Foundation/NSObject.h>
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 {
10 © RC Libros
CAPÍTULO 1: EMPEZANDO A PROGRAMAR CON OBJECTIVE-C
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.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
© RC Libros 11
OBJECTIVE-C. CURSO PRÁCTICO PARA PROGRAMADORES MAC OS X, IPHONE Y IPAD
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.
Las principales ventajas que indica Apple para el front-end Clang frente a GCC son:
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.
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.
Para compilar el ejemplo del Listado 1.1 con Clang, en vez de hacer:
2
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 PROGRAMADORES MAC OS X, IPHONE Y IPAD
Hacemos:
Análogamente, el ejemplo del Listado 1.2, del Listado 1.3 y del Listado 1.4 se
compilaría con el siguiente comando:
O el ejemplo del Listado 1.5, del Listado 1.6 y del Listado 1.7 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:
14 © RC Libros
CAPÍTULO 1: EMPEZANDO A PROGRAMAR CON OBJECTIVE-C
Ya hemos visto que la opción -arch permite indicar la plataforma para la que
queremos generar el binario. Actualmente, iOS soporta dos opciones:
• 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 enlace Figura 1.2: Plataformas de desarrollo
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
© RC Libros 15
OBJECTIVE-C. CURSO PRÁCTICO PARA PROGRAMADORES MAC OS X, IPHONE Y IPAD
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.
$ export DEVROOT=/Applications/Xcode.app/Contents/Developer/Platforms/
iPhoneOS.platform/Developer
$ export SDKROOT=$DEVROOT/SDKs/iPhoneOS5.1.sdk
Dado que el comando clang, ld, etc., a utilizar son también distintos
dependiendo de la plataforma de desarrollo, para compilar aplicaciones iOS también
se suele modificar la variable de entorno PATH para que encuentre los comandos de
la plataforma de iOS, antes que los de Mac OS X:
$ export PATH="$DEVROOT/usr/bin:$PATH"
16 © RC Libros