Successfully reported this slideshow.
Your SlideShare is downloading. ×

Curso programación iPhone

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Upcoming SlideShare
Desarrollo de ontologías
Desarrollo de ontologías
Loading in …3
×

Check these out next

1 of 85 Ad

More Related Content

Similar to Curso programación iPhone (20)

More from Miguel Rebollo (20)

Advertisement

Recently uploaded (20)

Curso programación iPhone

  1. 1. Programación para iPhone Campus de Verano EPSG Miguel Rebollo (@mrebollo)
  2. 2. ¿por qué es interesante desarrollar aplicaciones móviles? 50 50 40 30 20 15,1 10 5,2 4,1 0,5 0 2008 2009 2010 2011 2012 billones de $
  3. 3. 85.000 desarrolladores
  4. 4. el 80% gratuitas (fuente: Gartner)
  5. 5. si alguien quiere descargarse todas las aplicaciones para iPhone necesitaría 7 Tb $891.982
  6. 6. 275 días núm. 1 12 mill vendidas ($0,99) 30 mill gratuitas $1.000.000/mes publicidad
  7. 7. 10 apps a vigilar 1. Servicios basados en la localización 2. Redes sociales 3. Búsquedas móviles 4. Comercio móvil 5. Pago móvil 6. Servicios context-aware 7. Reconocimiento de objetos 8. Mensajería instantánea móvil 9. eMail móvil 10. Vídeo móvil (fuente: Gartner)
  8. 8. pero no todo está decidido
  9. 9. ¿Apps nativas o multiplataforma?
  10. 10. 0 5000 10000 15000 20000 miles de ud Q3 2007 Q4 2007 Q1 2008 Q2 2008 Q3 2008 Q4 2008 3G Q1 2009 Q2 2009 Q3 2009 Q4 2009 ventas iPhone 3GS Q1 2010 Q2 2010 Q3 2010 4 Q4 2010 Q1 2011 Q2 2011
  11. 11. 108.624.000
  12. 12. 0 100 200 300 400 500 Unknown 2008-08 2008-10 2008-12 2009-02 2009-04 2009-06 2009-08 2009-10 2009-12 2010-02 2010-04 2010-06 2010-08 2010-10 Apps disponibles 2010-12 2011-02 2011-04 miles de apps 2011-06
  13. 13. Precios 1000 800 600 400 200 0 0 11,99 23,99 35,99 47,99 99,99 219,99
  14. 14. Coste de una app ($1,49) 1% 15% Desarrollador 14% Apple Comisión tarjeta Procesamiento 70%
  15. 15. iPhone iPhone 3G iPhone 3GS iPhone 4 AMR procesador ARM 620 MHz A4 800 MHz 600 MHz RAM 128 MB 256 MB 512 MB capacidad 4,8,16 GB 8, 16 GB 8, 16, 32 GB 16, 32 GB 960x640 resolución 480x320 (retina disp) 5 Mpx cámara 2 Mpx 3 Mpx + frontal (0,3) vídeo no no si, VGA si, HD 720 otros 3G brújula giroscopio
  16. 16. 1 Mhz de velocidad 1 KB de memoria RAM 12 KB de memoria ROM 1 programa en ejecución
  17. 17. Objective-C
  18. 18. Ppio. diseño recursivo 1. Todo son objetos 2. Los objetos se hacen peticiones de uno a otro mediante paso de mensajes. 3. Cada objeto tiene su propia memoria, que consta de otros objetos. 4. Cada objeto es una instancia de una clase. Una clase agrupa objetos similares. 5. La clase es el repositorio del comportamiento asociado con un objeto. 6. Las clases están organizadas en una estructura arbórea que se denomina jerarquía de herencia.
  19. 19. Ventajas Desarrollo rápido Mejora calidad y legibilidad del código Mejora la mantenibilidad Niveles de abstracción Reusabilidad, encapsulamiento
  20. 20. ¿qué es una clase? Patrón que define atributos y métodos comunes a los objetos de un tipo Clase: teléfono móvil atributos: marca, modelo, número operaciones: encender, apagar, llamar Instancia: teléfono de Miguel atributos: marca=iPhone, modelo=3G, número=657 432 564
  21. 21. Encapsulamiento Comportamiento de “caja negra” Los “usuarios” de la clase ignoran sus detalles de implementación Interfaz de uso a través de sus métodos
  22. 22. Herencia Estructura jerárquica de las clases Una clase hereda la estructura de su clase padre Las clases pueden ampliar o refinar el comportamiento heredado
  23. 23. vehículo con motor sin motor coche moto bici velero coche eléctrico
  24. 24. Mensajes Los objetos se comunican mediante mensajes Los mensajes invocan los métodos de una clase En el mensaje se indica: objeto, método, parámetros (si hay)
  25. 25. Clases en Objective-C formada por @interface (.h) e @implementation (.m) en la interface se define la estructura de la clase atributos + métodos de acceso en la implementación se define su comportamiento
  26. 26. Declaración @interface NombreClase : NombreSuperclase <NombreProtocolo1,...> { // Zona de declaración de variables de instancia tipo_1 variableDeInstancia_1; tipo_N variableDeInstancia_N; } // Zona de declaración de métodos +(tipo) metodoDeClase; ... -(tipo) metodoDeInstancia:(tipo)argumento etiqueta:(tipo)otroArgumento;
  27. 27. Tipos de variables Pueden ser de 3 tipos @private: sólo visible para la clase (no se hereda) @protected: sólo visible para la clase y sus subclases @public: visible para todos (no se recomienda) Por defecto, todas son @protected.
  28. 28. Tipos de datos Básicos Clases void NSString/NSMutableString char NSArray/NSMutableArray int NSDictionary/ NSMutableDictionary float/double NSDate BOOL NSURL id NSObject
  29. 29. Métodos De clase… +(tipo)NombreMétodo:(tipo)argumento De instancia… -(tipo)NombreMétodo:(tipo)argumento Argumentos adicionales etiqueta:(tipo)argumento tres métodos importantes: alloc, init y dealloc
  30. 30. Implementación #import “NombreDeLaClase.h” @implementation NombreDeLaClase // No es preciso repetir superclase y protocolos -(id) init { [super init]; //Aquí se añaden instrucciones de inicialización return self; } -(tipo)nombreDeMetodo { …; } @end
  31. 31. Mensajería [<variable|clase> <nombre_método>]; [<variable|clase> <método>:<valor param>]; [<variable|clase> <método>:<valor1> <arg2>:<valor2> …]; Ejemplo: [userName compare:@”Pedro” options:NSCaseSensitive] [[NSURL alloc] initWithString:@”http://www.upv.es”];
  32. 32. Bifurcaciones (I) if (<condición>){ <código si cierto>; }else{ <código si falso>; } if( [username compare:@”Pedro”] ){ usermsg = @”Hola, Pedro”; else usermsg = @”Tú no eres Pedro”;
  33. 33. Bifurcaciones (II) switch (<expr_numérica>){ switch (num%2){ case <valor>: case 0: <código>; msg=@”es par”; break; break; case <valor>: case 1: …; msg=@”es impar”; otherwise: break; …; otherwise: } msg=@”error”; }
  34. 34. Bucles (I) Con guarda inicial (puede no ejecutarse nunca) while (<condición>){ …; }
  35. 35. Bucles (II) Con guarda al final (se ejecuta al menos una vez) do{ ...; }while (<condición>);
  36. 36. Bucles (III) for( <inicialización>; <paso>; <condición>){ …; } Ejemplo: int i; for( i = 0; i < 50; i++ ){ <código>; } Es un bucle que se ejecuta 50 veces
  37. 37. Gestión de memoria Para liberar la memoria de un objeto: [<variable> release]; Cuando son atributos de una instancia, debe hacerse en el método dealloc: -(void)dealloc{ [myLabel release]; [super dealloc]; //liberación de la clase padre }
  38. 38. Archivo: ListaDeAlimentos.h #import <Foundation/Foundation.h> @interface ListaDeAlimentos : NSObject { NSMutableDictionary * lista; } @property(readonly) NSMutableDictionary * lista; -(id)init; -(float)caloriasPorCienGramosDe:(NSString*)alimento; -(void)registrar:(NSString*)alimento caloriasPorCienGramos:(float)valor; -(void)eliminar:(NSString*)alimento; @end
  39. 39. Fíjate… • la clase tiene un único atributo (una lista dinámica) • se define como un puntero • se ha definido una propiedad para acceso directo al atributo • se declara el método init para inicialización • el método “registrar” tiene 2 argumentos
  40. 40. Archivo: ListaDeAlimentos.m #import "ListaDeAlimentos.h" @implementation ListaDeAlimentos @synthesize lista; -(id)init { [super init]; lista = [[NSMutableDictionary alloc] init]; return self; } -(float)caloriasPorCienGramosDe:(NSString*)alimento { NSString * calorias = [lista objectForKey:alimento]; return calorias ? [calorias floatValue] : -1.0; } -(void)registrar:(NSString*)alimento caloriasPorCienGramos:(float)valor{ NSString * copia = [alimento copy]; [lista setObject:[NSNumber numberWithFloat:valor] forKey:copia]; } -(void)eliminar:(NSString*)alimento { if (alimento) [lista removeObjectForKey:alimento]; else NSBeep(); } @end
  41. 41. Fíjate… • “synthesize” como pareja de la propiedad • en “init” se reserva la memoria de la lista • “registrar” añade un nuevo alimento • “eliminar” eliminar un alimento existente • “caloriasPorCienGramosDe” consulta la información nutricional de un alimento • observa los métodos para manipular el diccionario • ¡OJO! no hay dealloc: hay que vaciar la lista antes de terminar el programa
  42. 42. Archivo: Calorimetro.m #import <Foundation/Foundation.h> #import "ListaDeAlimentos.h" int main (int argc, const char * argv[]) { ListaDeAlimentos * p = [[ListaDeAlimentos alloc] init]; NSMutableDictionary * listaAlmacenada = p.lista; //Se añaden 2 alimentos [p registrar:@"Fresas" caloriasPorCienGramos:35.0]; [p registrar:@"Moras" caloriasPorCienGramos:59.0]; //Se muestra la información nutricional almacenada for(id alimento in listaAlmacenada) { printf("Alimento: %-10s ---> Calorías: %5.1fn", [alimento UTF8String], [[listaAlmacenada objectForKey:alimento] floatValue]); [p eliminar:alimento]; } return 0; }
  43. 43. Fíjate… • #import para utilizar la clase ListaDeAlimentos • definición de ListaAlmacenada como iterador • uso de @”” para definir cadenas constantes (en lugar de NSString) • bucle for optimizado para iterar en colecciones • printf para escribir en pantalla (otra alternativa: NSLog) • ¡OJO! no hay dealloc: hay que vaciar la lista antes de terminar el programa
  44. 44. Objective-C Miguel Rebollo (@mrebollo)
  45. 45. Excepciones Una excepción es una circunstancia que interrumpe el flujo normal del programa Clases para manejarlas: NSException NSError Clase definida por el usuario
  46. 46. Control de ejecución @try encierra el bloque que puede lanzar una excepción @catch contiene la lógica para tratar la excepción que se produce en @try @finally se ejecuta siempre @throw lanza una exepción
  47. 47. Definición NSException *exception = [NSException exceptionWithName: @"HotTeaException" reason: @"The tea is too hot" userInfo: nil]; @throw exception;
  48. 48. Ejemplo excepción Cup *cup = [[Cup alloc] init]; @try { [cup fill]; } @catch (NSException *exception) { NSLog(@"main: Caught %@: %@", [exception name], [exception reason]); } @finally { [cup release]; }
  49. 49. Test unitarios Casos de test: comprueban el funcionamiento del código (ej., clase) Conjuntos de tests: conjunto de casos de test que comprueban una aplicación Cada vez que se hace un cambio, deben lanzarse todos los tests para comprobar que todo sigue funcionando
  50. 50. Test-driven devel. El desarrollo por tests es un estilo de programación • Primero se escriben los tests • Después de escribe el código para pasar los tests. Pero no es necesario usarlo para poder emplear los tests unitarios
  51. 51. Tests lógicos Comprueban que el código funciona correctamente fuera de la aplicación. Se emplea para comprobar métodos, clases completas o conjuntos de clases.
  52. 52. Configurar test lóg 1.añadir un unit-test bundle como Target al proyecto 2.marca el target como activo 3.crea un grupo Test para los archivos 4.crea una clase para el test del tipo “Objective-C test case class” -> caso de test
  53. 53. Tests de aplicación Comprueban que el código funciona correctamente fuera de la aplicación. Se emplea para comprobar métodos, clases completas o conjuntos de clases.
  54. 54. Configurar test app 1. duplica el target de la aplicación y añade “Testing” como sufijo 2. añadir un unit-test bundle como target al proyecto; llámalo <app>Tests 3. arrastra el bundle sobre la aplicación 4. enlaza ambos bundles: arrastra el producto <app>Tests.octest sobre el mismo bundle dentro de Copy Bundle resources del de la app 5. crea una clase para el test del tipo “Objective-C test case class” -> conjunto de tests
  55. 55. Escribir tests Comprobación mediante asserts STFail provoca fallo incondicional STAssertEqualObjects falla si obj distintos STAssertEquals falla si valores distintos STAssertNil/STAssertNotNil falla si no nulo/nulo STAssertTrue/STAssertFalse falla si falso/cierto STAssertThrows falla si no se lanza una excepción
  56. 56. Ejemplo - (void) testEntryAmount { // entry se crea en un método setUp [entry setAmountInPennies:123]; STAssertEquals(123L, [entry amountInPennies], @"bad amount; 123 != %ld", [entry amountInPennies]); STAssertEquals((float)1.23, [entry amount], @"bad amount; 1.23 != %f", [entry amount]); } ver más en iOS Development Guide
  57. 57. Lecturas Del centro de desarrollo de Apple... Object-Oriented Programming with Objective-C The Objective-C Programming Language Otros libros… S.G. Kochan: Programming in Objective- C 2.0.- Addison-Wesley, 3ª Ed. (2011)
  58. 58. Cocoa Touch
  59. 59. Capas de iOS Cocoa Touch Media Core services Core OS
  60. 60. Capas de iOS Proporciona la funcionalidad Cocoa Touch principal UIKit: control de la interfaz Media Map Kit: vistas de Google Maps Core services Message Kit: envío de emails AddressBook Kit: acceso a la agenda Core OS
  61. 61. Capas de iOS Funcionalidades multimedia Cocoa Touch Audio ToolBox: reproducción y grabación de sonido Media OpenGL ES: Animación 2D y 3D Core services Media player: reproductor de medios Core Graphics: Dibujo en 2D Core OS Quartz Core: Animaciones
  62. 62. Capas de iOS Servicios del OS a bajo nivel Cocoa Touch Foundation: envoltorio a Objective-C Media Core Foundation: Fundation sobre C Core Location: servicio de Core services geoposicionamiento Core Data: modelo de datos SQLite Core OS Store Kit: compras dentro de las apps System Configuration: conf. red
  63. 63. Capas de iOS Servicios de bajo nivel (casi hw) Cocoa Touch CFNetwork: sockets BSD Media External Accesory: interfaces a accesorios conectados por bluetooth Core services Security: criptografía y acceso a llavero Core OS System: herramientas típicas de un framework de Unix
  64. 64. Ciclo de vida UIKit Nuestro programa El usuario pulsa el icono main() UIApplicationMain() applicationDidFinishLaunching bucle eventos Tratamiento de los eventos Stma. solicita finalizar applicationWillTerminate Aplicación finaliza
  65. 65. Clases del núcleo NSObject Es la clase base de la que dependen todas las demás. Proporciona los métodos de alloc, init y dealloc
  66. 66. Clases del núcleo UIApplication Todas las aplicaciones de iPhone son de este tipo. Gestiona su ciclo de vida, su configuración y también las insignias (ej. e-mails recibidos)
  67. 67. Clases del núcleo UIWindow Es el contenedor que almacenará las vistas de la aplicación. Una aplicación tendrá una única ventana que se crea automáticamente en los proyectos que usaremos
  68. 68. Clases del núcleo UIView Define un área rectangular en la pantalla del iPhone que gestiona todo lo que aparece en ella y su comportamiento. Los controles heredan de las vistas (las consideraremos subvistas).
  69. 69. Clases del núcleo UIResponder Los respondedores son los objetos que pueden responder a eventos. El control activo que va a recibir el evento es el primer respondedor
  70. 70. Clases del núcleo UIControl Es la superclase de la que heredan su comportamiento todos los controles de nuestas aplicaciones. Es la responsable de ejecutar el comportamiento asociado a cada control (veremos como se enlaza a través de Interface Builder)
  71. 71. Clases del núcleo UIViewController Gestionan el contenido de las vistas. Las usaremos para asignar el comportamiento asociado a un control (recuerda que un control es también una vista)
  72. 72. Clases de interfaz UILabel Etiquetas que muestran texto estático UITextField/UITextView Campos de texto para recibir entradas del usuario (activan el teclado) UIWebView Contiene una página web (identifica los links) o documentos (PDF y otros)
  73. 73. Clases de interfaz UIButton Botones para hacer click en ellos UISwitch Interruptores de dos posiciones: ON/OFF UISegmentedControl Barra táctil alargada con varias opciones
  74. 74. Modelo Vista-Controlador Controlador Acción de usuario Actualizar Vista Modelo Actualizar Datos
  75. 75. Controladores IBOutlet Controlador de salida Lee el estado de los controles definidos en la vista (uno por cada control) Es una variable de instancia Ejemplo: IBOutlet UILabel *miEtiqueta;
  76. 76. Controladores Propiedades con @property y @synthesize Usados para facilitar el acceso a IBOutlet Acceso directo a las variables (inst.outlet) en lugar de emplear mensajes @property se emplea en @interface @synthesize se emplea en @implementation
  77. 77. Controladores Ejemplo: @interface NombreClase:UIViewControler{ IBOutlet UILabel *miEtiqueta; } @property (retain, nonatomic) UILabel* miEtiqueta; […] @end @implementation NombreClase @synthesize miEtiqueta; […] @end
  78. 78. Controladores IBAction Define el método al que se debe llamar como resultado de un evento Es un método de la clase Ejemplo: -(IBAction)doCalculation:(id)sender;
  79. 79. Hola mundo personalizado definir outlet y acciones sobreescribir dealloc crear interfaz enlazar con controles (2 etiquetas + 1 botón) etiquetas: arrastra File Owner sobre etiqueta botón: arrastra “Touch Up Inside” sobre File Owner código para la acción
  80. 80. Cuentacuentos definir outlet y acciones sobreescribir dealloc crear interfaz enlazar con controles personalización controles de texto First responder y ocultación del teclado (asociado a Did End on Exit) Reemplazar texto
  81. 81. Catálogo de flores crear interfaz (outlet/ acciones, propiedades, enlazarlo, dealloc) uso de segment y switch. Conexión a Value Changed acceso a web con NSURL, NSURLRegister y requestWithURL ocultar vistas carga rápida viewDidLoad
  82. 82. Sistema solar aplicación de navegador uso de UITableView: definir secciones, rellenar celdas inclusión de vista de detalles (outlet/acciones, propiedades, enlazarlo, dealloc) crear la vista de detalles por código
  83. 83. Lecturas Del centro de desarrollo de Apple... Cocoa Application Tutorial iOS Development Guide iPhone Application Programming Guide View Programming Guide for iOS
  84. 84. Lecturas Otros libros… iPhone & iPad Apps for Abosolute Beginners (Ed. APRESS) Desrrollo de aplicaciones para iPhone (Ed. Anaya) The iPhone Developers Cookbook (Ed. Addison-Wesley) iOS Programming: The Big Nerd Ranch

×