1. 2 - OBJECTIVE-C
Curso de desarrollo de aplicaciones móviles para iPhone y iPad
endika.gutierrez@urbegi.com
alex.rayon@urbegi.com
Urbegi Learning
Contents
2. OBJECTIVE-C
• Objective-C es el lenguaje empleado por apple para todas sus
plataformas. OS X e iOS
• Es un lenguaje orientado a objetos
• Basado en C. De hecho es un superconjunto de este
• Compatible con librerias de C
• Sintaxis inspirada en Smalltalk
3. OBJECTIVE-C 2
• Data de principios de los 80
• Uno de los primeros lenguajes orientados a objetos
• Adoptado por Steve Jobs para su uso en el sistema operativo
NeXTStep
• Posteriormente dio lugar a OS X
• Todavía se conserva el prefijo ‘NS’ en muchas de las clases
del sistema
4. OBJECTIVE-C 3
• Es un lenguaje de programación muy verboso
• Existen métodos que pueden llegar a ocupar varias lineas
• Es muy raro el uso de excepciones aunque existen
• Pese a ser compatible con C difiere mucho en su sintaxis
• Es un lenguaje de Tipado dinámico
• El
comportamiento se decide en la fase de ejecución y no
en la de compilación
5. SINTAXIS DE
OBJECTIVE-C
• En Objective-C no se llaman funciones
• Se pasan mensajes entre objetos
• [objeto mensaje];
• Equivalente en Java a
• objeto.mensaje();
6. SINTAXIS DE
OBJECTIVE-C 2
• [objeto mensaje];
• Los mensajes van entre []
• Se pueden anidar llamadas siempre que estas vayan entre
corchetes:
• [[objeto mensaje] otroMensaje];
• El método a ejecutar se resuelve en tiempo de ejecución
7. SINTAXIS DE
OBJECTIVE-C 3
• Los parametros quedan intercalados
• [objeto mensaje:param1 otroParam:param2];
• Equivalente en Java a
• objeto.mensaje(param1, param2);
8. SINTAXIS DE
OBJECTIVE-C 4
• También se pueden anidar llamadas en los parametros
• [objeto mensaje:[usuario nombre]
otroParam:[lista objectAtIndex:0]];
• Equivalente en Java a
• objeto.mensaje(usuario.nombre(), lista[0]);
• En Objective-C se suelen generar llamadas a funciones muy
verbosas
9. SINTAXIS DE
OBJECTIVE-C 5
• El receptor del mensaje puede ser nil
• Equivalente a null en Java
• Es posible mandar un mensaje a nil sin que se produzca
errores ni NullPointerException
• Estas llamadas devuelven 0 ó nil ó NO
• ¡Elpaso de un mensaje a un objeto que no pueda responderlo
dará una excepción!
10. TIPOS BÁSICOS
• Los objetos de Objective-C siempre se manejan con punteros
• El tipo genérico para cualquier objeto es id
• Equivalente a void* en C/C++
11. TIPOS BÁSICOS 2
• Los tipos básicos son compartidos con C
• int, float, doble, long...
• Además incluye nuevos tipos
• Los valores booleanos son del tipo BOOL
• Pueden tomar los valores YES y NO
12. TIPOS BÁSICOS 3
• self representa a la instancia actual
• Similar a this en Java o en C++
• super representa la clase padre de la actual
• Similar a super de Java
13. TIPOS BÁSICOS 4
• Todos los objetos en Objective-C heredan de la clase
NSObject
• Similar a la clase Object de Java
14. TIPOS BÁSICOS 5
• Objective-C posee clases para las estructuras básicas de datos
• NSString y NSMutableString para Cadenas de texto
• NSArray y NSMutableArray para Listas
• NSDictionary y NSMutableDictionary para Mapas
• Están diferenciados los objetos mutables de los inmutables
15. CADENAS DE TEXTO
• NSString y NSMutableString manipulan cadenas de
texto
• Laprimera de ellas no se puede modificar el contenido.
La segunda sí.
• Las cadenas de texto se pueden definir con @”texto”
• Para diferenciarlas de las cadenas de C ”texto”
• Ejemplo: NSString *texto = @”un texto”;
16. DEFINICIÓN DE
CLASES
• Interfaz e implementación separados en dos ficheros
• Como en C++
• .h para la interfaz
• .m para la implementación
17. DEFINICIÓN DE
CLASES
• Sintaxis de definición de clases
• Ficheros .h
@interface Clase : Superclase
...definición...
@end
18. DEFINICIÓN DE
CLASES
• Sintaxis de implementación de clases
• Ficheros .m
@implementation Clase
...implementación...
@end
19. DEFINICIÓN DE
CLASES
• Los métodos de clase se definen así:
• - (ClaseRetorno *)metodoConParametro:(ClaseParam1 *)param1
parametro2:(ClaseParam2 *)param2
otroParametro:(ClaseParam3 *)param3;
• Elsímbolo - antes del método indica que es un método de
instancia
• Elsímbolo + antes del método indica que es un método de
clase
20. REFERENCIAS A
CLASES EXTERNAS
• Se incluyen cabeceras con #import
•A diferencia de los #include de C evita que una misma
cabecera se incluya dos veces
• Laimplementación de la clase deberá importar la interfaz de
la misma
• Lainterfaz de la clase debará importar las clases que se vayan
a necesitar. Cómo mínimo la clase padre.
21. VARIABLES DE
OBJETO
• Definidas en la interfaz de la clase entre {}
@interface Clase : Superclase {
int _variable1;
float _variable2;
NSArray *_unaLista;
}
@end
22. VARIABLES DE
OBJETO
• Normalmente las variables de instancia llevan un _ por
delante para diferenciarlas de las variables locales
@interface Clase : Superclase {
int _variable1;
float _variable2;
NSArray *_unaLista;
}
@end
23. EJEMPLO PERSONA.H
#import <Foundation/Foundation.h> // incluye la definición de
los objetos básicos
@interface Persona : NSObject {
NSString *_nombre; // atributos
NSString *_apellido;
int _edad;
float _altura;
NSArray *_habilidades;
}
- (void)saluda;
@end
24. EJEMPLO PERSONA.M
#import “Persona.h” // incluye la interfaz
@implementation Persona
- (void)saluda
{
NSLog(@”Hola, me llamo %@.”, _nombre); // NSLog funciona
como printf. %@ imprime el valor de un objeto
}
@end
25. PROPIEDADES
• Laspropiedades definen el acceso a las variables de los
objetos
• Equivalente a los Getters y Setters de Java
• Se acceden como objeto.propiedad
26. PROPIEDADES 2
• Se definen en la interfaz como
• @property (nonatomic, copy) NSString * nombre;
• nonatomic indica que el setter no debe ser thread-safe
• copy indica que se debe copiar el objeto en el setter
• Otras opciones son strong y weak que veremos en el
capítulo de gestión de memoria.
27. PROPIEDADES 3
• Se definen en la implementación como
• @synthesize nombre = _nombre;
•A la derecha de la igualdad indicamos la variable en la que
queremos que se almacene el valor (Opcional)
• Veamos un ejemplo con propiedades
28. EJEMPLO 2
PERSONA.H
#import <Foundation/Foundation.h> // incluye la definición de
los objetos básicos
@interface Persona : NSObject
// propiedades
@property (nonatomic, copy) NSString *nombre;
@property (nonatomic, copy) NSString *apellido;
@property (nonatomic) int edad;
@property (nonatomic) float altura;
@property (nonatomic, copy) NSArray *habilidades;
- (void)saluda;
@end
29. EJEMPLO 2
PERSONA.M
#import “Persona.h” // incluye la interfaz
@implementation Persona
@synthesize nombre = _nombre;
@synthesize apellido = _apellido;
@synthesize edad = _edad;
@synthesize altura = _altura;
@synthesize habilidades = _habilidades;
- (void)saluda
{
NSLog(@”Hola, me llamo %@.”, self.nombre); // NSLog
funciona como printf. %@ imprime el valor de un objeto
}
@end
30. CONSTRUCTORES
• La creación de objetos en Objective-C se hace en dos etapas
•1 - Reserva de la memoria alloc
•2 - Inicialización init
31. CONSTRUCTORES 2
• Ejemplo de creación de la clase Persona del ejemplo
anterior:
• Persona *pablo = [[Persona alloc] init];
32. CONSTRUCTORES 3
• Podemos sobrecargar el método init para personalizar la
creación del objeto
- (id)init
{
self = [super init]; // También debemos llamar al
constructor padre
if (self) {
// Inicialización del objeto
}
return self;
}
33. CONSTRUCTORES 4
• El
método init puede recibir parametros para la
construcción:
• Persona *pablo = [[Persona alloc] initWithName:@”Pablo”
surname:@”Picasso”];
34. CONSTRUCTORES 5
• Algunas clases poseen métodos estáticos para crear los
objetos en una única llamada:
• NSArray *lista = [NSArray arrayWithObjects:@”Pablo”, @”Juan”,
@”Pepe”, nil];
• Estas llamadas no actuan igual que alloc init.
• Veremos las diferencias en el capítulo de gestión de
memoria
35. ESTRUCTURAS DE
DATOS
• EnObjective-C estan diferenciadas las listas y mapas que
son editables y las que no
• Losobjetos inmutables se deberán indicar todos los objetos
en el momento de su creación
• [NSArray arrayWithObjects:@”Pablo”, @”Juan”, @”Pepe”, nil];
• Objective-C no tiene sobrecarga de operadores por lo que
todas las operaciones son métodos
36. ESTRUCTURAS DE
DATOS - NSARRAY
• Las clases para la gestión de listas son NSArray y
NSMutableArray
• Obtener un objeto de la lista:
- (id)objectAtIndex:(NSUInteger)index;
• Añadir un objeto a la lista:
- (void)addObject:(id)object;
37. ESTRUCTURAS DE
DATOS - NSARRAY 2
• Para la contrucción de arrays existen diversos métodos
+ (id)arrayWithObject:(id)object; // Array con un único objeto
+ (id)arrayWithObjects:(id)object, ...; // Array con una lista
de objetos separados por coma y acabados en nil
+ (id)arrayWithObjects:(const id*)object
count:(NSUInteger)count; // Array con una
lista de objetos
+ (id)arrayWithArray:(NSArray)array; // Copia de otro array
38. ESTRUCTURAS DE
DATOS - NSARRAY 3
• Para
la contrucción de arrays mutables existen otros
métodos
+ (id)arrayWithCapacity:(NSUInteger)capacity; // Array con n
posiciones reservadas
39. ESTRUCTURAS DE
DATOS -
NSDICTIONARY
• Las clases para la gestión de mapas son NSDictionary y
NSMutableDictionary
• Obtener un objeto del mapa:
- (id)objectForKey:(id)key;
• Añadir un objeto al mapa:
- (void)setObject:(id)object forKey:(id)key;
40. ESTRUCTURAS DE
DATOS -
NSDICTIONARY 2
• Para la creación de diccionarios existen varios métodos
+ (id)dictionaryWithObject:(id)object forKey:(id)key; //
Diccionario con un único objeto
+ (id)dictionaryWithObjectsAndKeys:(id)firstObject, ...; //
Diccionario con un listado de objetos acabados en nil
+ (id)dictionaryWithDictionary:(NSDictionary *)dict; //
Diccionario con copia
+ (id)dictionaryWithObjects:(NSArray *)objects
forKeys:(NSArray *)keys; // Diccionario
con un listado de claves y otro de valores
41. ESTRUCTURAS DE
DATOS -
NSDICTIONARY 3
• Para
la creación de diccionarios mutables existen varios
métodos
+ (id)dictionaryWithCapacity:(NSUInteger)capacity;//
Diccionario con n posiciones reservadas