Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString...

22
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

Transcript of Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString...

Page 1: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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

Page 2: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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

Page 3: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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

Page 4: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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

Page 5: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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];

Page 6: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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);

Page 7: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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");

Page 8: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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

Page 9: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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;

Page 10: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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);

Page 11: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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

Page 12: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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";

Page 13: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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];

Page 14: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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}

Page 15: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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

Page 16: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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];

Page 17: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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];

Page 18: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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)];

Page 19: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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);                }

Page 20: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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];

Page 21: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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];

Page 22: Introducción a Xcode y Objective-C · • Las cadenas en Objective-C son objetos de clase NSString • No confundir con las cadenas de C (char *) • Los literales de NSString se

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