introducción a xcode y objective-c · • las cadenas en objective-c son objetos de clase nsstring...
TRANSCRIPT
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2012-13 Depto. Ciencia de la Computación e IA
Introducción a Xcode y Objective-C
Sesión 2: Introducción a Objective-C
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Puntos a tratar• Paso de mensajes• Instanciación de objetos• Manejo de cadenas• Tipos de datos• Directivas• Gestión de fechas• Tratamiento de errores• Clase NSObject• Colecciones de datos
2
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Objective-C• Extensión del lenguaje C orientada a objetos• Ficheros con extensión .m en lugar de .c• Utilizaremos la API Cocoa Touch
• Diferente a C++• Se basa en paso de mensajes en lugar de llamadas a métodos
• Podemos utilizar cualquier elemento de C estándar
• Existe la variante Objective-C++• Permite utilizar código C++ dentro de Objective-C• Ficheros con extensión .mm
3
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Paso de mensajes• En Objective-C se habla de paso de mensajes• Similar a lenguajes como Smalltalk• La dirección a llamar se resuelve en tiempo de ejecución
• Obtener longitud de una cadena
• El método puede no existir en el objeto receptor del mensaje
4
NSString* cadena = @"cadena-‐de-‐prueba";int tam = [cadena length];
NSString* cadena = @"cadena-‐de-‐prueba";[cadena metodoInexistente]; // Produce warning, pero compila
id cadena = @"cadena-‐de-‐prueba";[cadena metodoInexistente]; // Solo da error de ejecucion
Puntero genérico a objeto
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Creación e inicialización• Reservamos memoria para un objeto con alloc• Inicializamos el objeto con un inicializador init
• Inicialización mediante métodos factoría• Son métodos de clase• No hace falta que reservemos memoria nosotros• Su nombre comienza por el del objeto que van a crear
5
NSString *cadVacia = [[NSString alloc] init];NSString *cadFormato = [[NSString alloc] initWithFormat: @"Numero %d", 5];
NSString *cadVacia = [NSString string];NSString *cadFormato = [NSString stringWithFormat: @"Numero %d", 5];
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Cadenas• Las cadenas en Objective-C son objetos de clase NSString• No confundir con las cadenas de C (char *)• Los literales de NSString se crean con el prefijo @
• Crear una cadena con formato
• Impresión de logs
• Aparecen en la consola de depuración
6
NSString *nombre = @"Pepe";int edad = 20; NSString *cadena = [NSString stringWithFormat: @"Nombre: %@ (edad %d)", nombre, edad];
NSString *cadena = @"Cadena";
NSLog(@"i = %d, obj = %@", i, obj);
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Localización de cadenas• Por defecto se extraen a un fichero Localizable.strings• Creamos el fichero con New File > iOS > Resource > Strings File
• Formato del fichero
• Acceso a la cadena localizada desde el código
7
"identificador" = "cadena a mostrar";
"Titulo" = "Moviles UA";
NSString *cadenaLocalizada = NSLocalizedString(@"Titulo", @"Mobile UA");
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Tipos de datos básicos• Contamos con todos los tipos básicos de C• char, short, int, long, float, double, ...
• Cocoa Touch define tipos básicos adicionales• Se adaptan a la arquitectura (32 ó 64 bits)
NSInteger (entero con signo)NSUInteger (entero sin signo)CGFloat (flotante)
• Tipo booleano• Puede tomar como valor las constantes YES o NO
BOOL b = YES;
8
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Enumeraciones
• Se definen igual que en C• Cada elemento tiene asignado un valor entero (incremental)
• Podemos asignar manualmente los valores
9
typedef enum { UATipoAsignaturaOptativa, UATipoAsignaturaObligatoria, UATipoAsignaturaTroncal} UATipoAsignatura;
typedef enum { UATipoAsignaturaOptativa = 0, UATipoAsignaturaObligatoria = 1, UATipoAsignaturaTroncal = 2} UATipoAsignatura;
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Estructuras de datos
• También se definen igual que en C
• En Cocoa Touch hay funciones para inicializar y gestionar las estructuras que define
10
struct CGPoint { CGFloat x; CGFloat y;};typedef struct CGPoint CGPoint;
CGPoint punto = CGPointMake(x,y);
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Directivas
• #import• Importa fichero de cabecera .h• A diferencia de #include, evita inclusiones cíclicas
• #pragma mark• Permite etiquetar segmentos de código
11
#pragma mark Constructores// Código de los constructores #pragma mark Eventos del ciclo de vida// Código de los manejadores de eventos
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Constantes
• Se definen mediante el modificados const• Afecta al elemento justo a su izquierda
• Es preferible definir las constantes con const en lugar de #define
12
// Puntero variable a objeto NSString constante (MAL)const NSString * UATitulo = @"Menu"; // Equivalente al anterior (MAL)NSString const * UATitulo = @"Menu"; // Puntero constante a objeto NSString (BIEN)NSString * const UATitulo = @"Menu";
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Gestión de fechas• Se gestionan mediante la clase NSDate
• Podemos obtener los componentes de una fecha
• O una fecha a partir de sus componentes
13
NSDate *fecha = [NSDate date];
NSCalendar *calendario = [NSCalendar currentCalendar];NSDateComponents *componentes = [calendario components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:fecha]; NSInteger dia = [componentes day];NSInteger mes = [componentes month];NSInteger anyo = [componentes year];
NSDateComponents *componentes = [[NSDateComponents alloc] init];[componentes setDay: dia];[componentes setMonth: mes];[componentes setYear: anyo]; NSDate *fecha = [calendario dateFromComponents: componentes];[componentes release];
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Tratamiento de errores• Se pueden utilizar excepciones
• Son siempre unchecked• Para errores de tipo checked suele utilizarse NSError
14
NSError *error = nil;NSString *contenido = [NSString stringWithContentsOfFile: @"texto.txt" encoding: NSASCIIStringEncoding error: &error];if(error != nil) { NSString *motivo = [error localizedFailureReason];}
@try // Codigo @catch(NSException *ex) { // Codigo tratamiento excepcion}@finally { // Codigo de finalización}
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Clase NSObject• Casi todos los objetos heredan de ella en última instancia• Se suelen redefinir una serie de métodos de NSObject• isEqual
Comprueba si dos objetos son iguales internamenteDevuelve YES o NO
• descriptionDevuelve la descripción del objeto en forma de cadenaEs lo que se obtiene al imprimir el objeto con %@
• hashCódigo hash para indexar el objetoDebe ser coherente con isEqual
• Todos los objetos disponen de los métodos anteriores
15
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Copia de objetos
• Algunos objetos pueden copiarse con el método copy
• Objetos mutables e inmutables• Algunos objetos existen en las dos modalidades
NSString y NSMutableString
• Podemos obtener copias mutables de objetos inmutables con mutableCopy
16
NSString *cadena = @"Mi cadena"; NSString *copiaInmutable = [cadena copy]; NSMutableString *copiaMutable = [cadena mutableCopy];
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Colecciones de datos• Colecciones genéricas de objetos• Listas
• Diccionarios
• Conjuntos
• Existen versiones mutables e inmutables de cada una• NSMutableArray, NSMutableDictionary, NSMutableSet
17
NSArray *lista = [NSArray arrayWithObjects: obj1, obj2, obj3, nil];
NSSet *conjunto = [NSSet setWithObjects: obj1, obj2, obj3, nil];
NSDictionary *diccionario = [NSDictionary dictionaryWithObjectsAndKeys: obj1, @"clave1", obj2, @"clave2", obj3, @"clave3", nil];
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Tipos básicos en las colecciones• Valor nulo
• Números
• Otros tipos
18
[NSNull null]
NSNumber *booleano = [NSNumber numberWithBool: YES];NSNumber *entero = [NSNumber numberWithInt: 10];NSNumber *flotante = [NSNumber numberWithFloat: 2.5];...BOOL valorBool = [booleano boolValue];int valorEntero = [entero intValue];float valorFlotante = [flotante floatValue];
typedef struct { int x; int y;} Punto;...Punto p;NSValue *valorPunto = [NSValue valueWithBytes:&p objCType:@encode(Punto)];
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Acceso a los elementos de las listas• Número de elementos
• Cada elemento de la lista está en un índice, de 0 a count-1• Acceso a un elemento determinado
• Recorrer la lista
• Si todos los elementos de la lista son de un tipo, podemos utilizar
19
NSUInteger numElementos = [lista count];
id primerObjeto = [lista objectAtIndex: 0];
for(id obj in lista) { NSLog(@"Obtenido el objeto %@", obj); }
for(NSString *cadena in lista) { NSLog(@"Obtenida la cadena %@", cadena); }
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Listas mutables• Podemos modificar los elementos que contienen
• Operaciones
20
NSMutableArray *listaMutable = [NSMutableArray arrayWithCapacity: 100];
// A partir del indice 5 se mueven a la siguiente posición[listaMutable insertObject:obj atIndex:5]; // Lo añade al final de la lista[listaMutable addObject:obj]; // A partir del indice 5 se mueven a la anterior posición[listaMutable removeObjectAtIndex:5]; // Es más eficiente, con coste constante[listaMutable removeLastObject]; [listaMutable replaceObjectAtIndex:5 withObject:obj];
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
Diccionarios• Contienen parejas (clave, valor)• Obtención del valor asociado a una clave
• Listas de claves y valores
• Diccionarios mutables
• Establecer valor para una clave o eliminarla
21
NSMutableDictionary *diccionarioMutable = [NSMutableDictionary dictionaryWithCapacity: 100];
id obj = [diccionario objectForKey:@"clave1"];
[diccionario setObject:obj forKey:@"clave1"];[diccionario removeObjectForKey:@"clave1"];
NSArray *claves = [diccionario allKeys];NSArray *valores = [diccionario allValues];
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Xcode y Objective-C © 2012-13 Depto. Ciencia de la Computación e IA Objective-C
¿Preguntas...?
22