AppCity 2012 iOS Principiante Dia 1

Post on 24-Dec-2015

8 views 0 download

description

Apuntes de AppCity 2012 Día 1

Transcript of AppCity 2012 iOS Principiante Dia 1

Curso de desarrollo iOS(principiante)

sábado 4 de febrero de 12

Ricardo Castellanosricardo@atomicflavor.comtwitter : @ricardocahe

Miguel José García Corcheromiguel@atomicflavor.comtwitter : @miguelgarciacor

PROFESORES

sábado 4 de febrero de 12

HORARIO

9:30 - 11:00 11:00 - 11:30 Break11:30 - 13:0013:00 - 14:3014:30 - 15:30 Break15:30 - 17:3017:30 - 18:00 Break18:00 - 19:00

sábado 4 de febrero de 12

DÍA 1

A Simple iOS Application Objective-C Managing memory with ARC

sábado 4 de febrero de 12

DÍA 2

Delegation and Core Location Mapkit and Text Input Subclassing UIView and UIScrollView View Controllers Notification and Rotation

sábado 4 de febrero de 12

DÍA 3

UITableView and UITableViewController Editing UITableView UINavigationController Camera UIPopoverController and Modal View Controllers

sábado 4 de febrero de 12

DÍA 4

Saving, Loading, and Multitasking Subclassing UITableViewCell Core Data Localization Settings

sábado 4 de febrero de 12

¿QUE VAMOS A APRENDER EN ESTE CURSO?

Cocoa Touch

Cocoa Touch es el API para el desarrollo de aplicaciones orientado a objetos. Esta incluye a su vez 3 frameworks que usaremos para poder trabajar con iOS:

• UIKit, que proporciona todos los elementos gráficos para nuestra aplicación mediante interfaces a su framework.

• Fundation Framework, es el conjunto de clases que utiliza para representar estructuras de datos complejas.

• Address Book UI Framework, nos ayuda a acceder a los datos de nuestros contactos.

Objective-C

Es un lenguaje de programación basado en C, y que ha sido modificado para poder trabajar orientado a objetos, con lo cual puedes crear clases, objetos, variables de instancias, métodos, utilizar encapsulación, etc.

sábado 4 de febrero de 12

Mimicry: acción de aprender imitando a alguien o algo Explicación Ejemplo Práctica

¿CÓMO VAMOS A APRENDER??

sábado 4 de febrero de 12

1. UNA APLICACIÓN SIMPLE

¿Qué pasa cuando arranca una aplicación iOS? Window - View SDK iOS: librería orientada a objetos. Las ventanas y las

vistas se representan como objetos.

sábado 4 de febrero de 12

GESTIÓN DE VISTAS

sábado 4 de febrero de 12

CICLO DE VIDA

Delegate Controlador Vista

Inicio

Fin

Boton {Preferencias()}

Inicio {AbrirTitulo()}

AbrirPreferencias() Preferencias()

AbrirTitulo()

sábado 4 de febrero de 12

1. PATRÓN MVC

El modelo-vista-controlador es un patrón arquitectónico. Se emplea para estructurar las interfaces de los programas de una manera en la que separamos tareas diferentes en diferentes capas. Por un lado tenemos la presentación, por otro la lógica de aplicación y por otro la información del dominio.

sábado 4 de febrero de 12

1. PATRÓN MVC - MODELO

El modelo encapsula los datos específicos de una aplicación y define la lógica y los proceso de computo que manipulan esos datos. Muchos de estos datos son el estado de la parte persistente de la aplicación.

Como los objetos de modelo representan conocimiento y experiencia respecto a un determinado dominio de problema, pueden reusarse en problemas con un dominio similar.

sábado 4 de febrero de 12

1. PATRÓN MVC - MODELO

Los objetos de dominio son clases donde almacenamos la información de nuestro programa en tiempo de ejecución. También la lógica que maneja estos datos y que será invocada desde el controlador.

Estas clases no tienen que ser de un tipo concreto, por lo que lo usual es que heredemos de NSObject para crearlas.

sábado 4 de febrero de 12

1. PATRÓN MVC - VISTA

Una vista es algo que el usuario ve. Un objeto de tipo vista conoce como pintarse y como responder a las interacciones del usuario. El objetivo principal es representar los datos de los objetos del modelo de dominio.

Por ejemplo cuando tenemos un text field en una vista y lo modificamos, la vista cambiará el objeto de dominio pero sólo a través del controlador.

sábado 4 de febrero de 12

1. PATRÓN MVC - VISTA

La vista la crearemos en nuestro fichero.xib. Para la creación de la vista utilizaremos Interface Builder y la construiremos a base de widgets predefinidos del framework Cocoa Touch o a través de widgets propios.

sábado 4 de febrero de 12

1. PATRÓN MVC - CONTROLADOR

Un controlador es un objeto que actuá de intermediario entre una o mas vistas de aplicaciones y uno o más modelos de dominio. El controlador es como un conducto a través del cual los objetos se informan del cambio en la interface y viceversa. Los Controladores también pueden ajustar tareas de la aplicación y manejar el ciclo de vida de los objetos.

sábado 4 de febrero de 12

1. PATRÓN MVC - CONTROLADOR

El controlador emplea el patrón fachada, actuando como una capa intermedia que aglut ina todas las funcionalidades de dominio, mediante llamadas a estos objetos y que es accesible desde la vista.

Para ello se crean instancias de los objetos de dominio. También los objetos que asociaremos a objetos de la interface y los métodos que se llamaran desde los objetos de la interface.

sábado 4 de febrero de 12

1. CREAR UN PROYECTO CON XCODE

HOLA MUNDO

Una buena forma de familiarizarse con los lenguajes de programación y con los entornos de desarrollo es crear una aplicación sencilla que muestre un mensaje en pantalla. Estos pequeños programas se crean usando la frase ‘Hola Mundo’ casi como un estándar, así que manos a la obra.

Abrimos XCode:

sábado 4 de febrero de 12

Creamos un nuevo proyecto:

Seleccionamos el tipo de proyecto:

1. CREAR UN PROYECTO CON XCODE

sábado 4 de febrero de 12

Elegimos un nombre para el proyecto (HolaMundo).

Añadimos un nuevo fichero al proyecto.

Elegimos UIViewController y seleccionamos la opción “With XIB for user interface”. Nos pedirá un nombre, elegimos MensajeController.

Ahora tenemos que hacer que se abra el XIB que acabamos de crear justo al inicio.

1. CREAR UN PROYECTO CON XCODE

sábado 4 de febrero de 12

Abrimos el Interface Builder y añadimos un Label:

1. CREAR EL INTERFAZ

sábado 4 de febrero de 12

En el .h del Delegate creamos una referencia a nuestro controlador:

#import <UIKit/UIKit.h>#import "MensajeController.h"

@interface HolaMundoAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window;! MensajeController *mensajeController;}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

1. DECLARACIONES

sábado 4 de febrero de 12

Cargamos la vista al cargar la aplicación:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

mensajeController=[[MensajeController alloc]initWithNibName:@"MensajeController" bundle:nil];[window addSubview:mensajeController.view];[self.window makeKeyAndVisible];return YES;

}

1. IMPLEMENTAR MÉTODOS

sábado 4 de febrero de 12

En el .h del controlador, creamos la variable que hará referencia al label creado:

#import <UIKit/UIKit.h>

@interface MensajeController : UIViewController {! IBOutlet UILabel *mensaje; IBOutlet UIButton *boton;}

@property (nonatomic, retain) IBOutlet UILabel *mensaje;@property (nonatomic, retain) IBOutlet UIButton *boton;

-(IBAction)saludar:(id)sender;

@end

Para poder acceder a esa variable, en el .m añadimos:

@synthesize mensaje;

1. CONFIGURAR PUNTEROS

sábado 4 de febrero de 12

Tenemos que referenciar la variable del Label con el Label del Interface Builder :

1. CONECTORES

sábado 4 de febrero de 12

Añadimos un texto cualquiera al label al inicio. Esto se hace en el método saludar del controlador:

- (void)saludar {!! [mensaje setText:@"Hola Mundo"];}

1. CONFIGURAR ACCIONES Y OBJETOS

sábado 4 de febrero de 12

Desde el Files Owner, nuestros conectores se deben de quedar configurados de la siguiente manera:

1. RESUMEN DE CONECTORES

sábado 4 de febrero de 12

Ya solo queda compilar y arrancar nuestro programa, y si todo ha ido bien, aparecerá el mensaje “Hola Mundo” en el simulador del iPhone al presionar el botón.

1. COMPILAR Y EJECUTAR

sábado 4 de febrero de 12

Ahora que sabemos probar nuestra aplicación en el simulador, es hora de probarla en el dispositivo.Necesitamos un certificado de desarrollador.Asignar el Bundle Identifier (App Id): com.atomicflavor.examplePerfil de aprovisionamiento: example.mobileprovision

1. DESPLEGAR LA APLICACIÓN

sábado 4 de febrero de 12

1. ICONOS DE LA APLICACIÓN

Es muy importante el diseño del icono, ya que es lo primero que va a ver el posible comprador de la aplicación.

Tamaños: iPhone/iPod Touch sin Retina display: 57x57 pixels iPhone/iPod Touch con Retina display: 114x114 pixels iPad: 72x72 pixels

sábado 4 de febrero de 12

1. ICONOS DE LA APLICACIÓN

Para insertar los iconos, arrastramos a:

sábado 4 de febrero de 12

Podemos cargar imágenes al arrancar la aplicación.

Tamaños: iPhone/iPod Touch sin Retina display: 320x480 pixels iPhone/iPod Touch con Retina display: 640x960 pixels iPad: 1024x768 pixels

1. CARGAR IMÁGENES

sábado 4 de febrero de 12

2. OBJECTIVE-C

Las aplicaciones de iOS se desarrollan en Objective-C

Objective-C es una extensión del lenguaje C

Cocoa Touch son un un conjunto de clases en Objective-C

sábado 4 de febrero de 12

2. OBJETOS

Coche

int numRuedas; //Atributo

-(int) getNumRuedas; //Método-(void) setNumRuedas:(int)n;

- Clase: propiedad y comportamiento de un objeto concreto.- Objeto: es una instancia a una clase.- Atributo: propiedad del objeto.- Método: es lo que un objeto puede hacer. Algoritmo.- Evento: interacción del usuario con la máquina.- Mensaje: comunicación dirigida a un objeto ordenándole que ejecute uno de sus métodos.

sábado 4 de febrero de 12

2. USAR INSTANCIAS

Como hemos visto, para crear un objeto usamos alloc, esto crea una instancia a ese objeto y reserva memoria.NSMutableArray *listaPersonas = [NSMutableArray alloc];

Pero un objeto para ser usado, necesita que reservemos memoria y esté inicializado, para ello usamos init.[listaPersonas init];

Es muy común usarlos juntos:NSMutableArray *listaPersonas = [[NSMutableArray alloc] init];

sábado 4 de febrero de 12

2. ENVIAR MENSAJES

- Mensaje: comunicación dirigida a un objeto ordenándole que ejecute uno de sus métodos.

NSMutableArray *listaPersonas = [[NSMutableArray alloc] init];[listaPersonas addObject:personaX];

sábado 4 de febrero de 12

2. DESTRUIR OBJETOS

Para destruir objetos se usa el mensaje release.[listaPersonas release];

Esta instrucción destruye el objeto apuntado por la variable listaPersonas.Aunque hemos destruido la referencia que apunta al objeto, listaPersonas sigue teniendo valor, para limpiarla usamos nil.listaPersonas = nil;

sábado 4 de febrero de 12

2. NSSTRING

NSString es una clase de Objective-C usada para representar cadenas.NSString *cadena = @”Hola Mundo”;

No es necesario usar alloc para reservar memoria ya que NSString usa el prefijo @ para hacerlo.

Aunque también se podría hacer:NSString *cadena = [[NSString alloc] initWithString:@”Hola Mundo”];

sábado 4 de febrero de 12

2. NSARRAY Y NSMUTABLEARRAY

Un array es una colección de objetos. Es una lista ordenada de objetos a la que se puede acceder a través de un índice.

NSArray una vez que se ha instanciado, no se pueden añadir o borrar objetos.

NSMutableArray, es un array dinámico al que podemos añadir o borrar objetos en cualquier momento.

sábado 4 de febrero de 12

2. HEREDAR UNA CLASE

Todas las clases en Objective-C tienen una superclase, excepto NSObject.Una clase hereda el comportamiento de su superclase.

sábado 4 de febrero de 12

2. VARIABLES DE INSTANCIA

Cada vez que se crea un objeto, el sistema crea una copia de todas las variables que están vinculadas con dicha clase haciéndolas propias de esa instancia y solamente pudiéndose acceder a ellas a través del identificador del objeto.

@interface Persona : NSObject { NSString *nombre; NSString *dni; int edad;}

@end

sábado 4 de febrero de 12

2. MÉTODOS DE ACCESO

Ahora que tenemos nuestras variables de instancia, necesitamos alguna forma de acceder a ellas para darles valor o para obtenerlo.Para ello usamos los métodos de acceso.También llamados getter y setter :

-(NSString *) getNombre{ return nombre;}

-(void) setDni:(NSString *)newDni{ dni = newDni;}

sábado 4 de febrero de 12

2. MÉTODOS DE INSTANCIA

Además de los métodos de acceso, tenemos otros métodos que nos ayudan a resolver otras tareas.

Por ejemplo, el método -(bool)validarDni; lo usaremos para validar el dni de un objeto de clase Persona.

Los métodos de instancia se suelen declarar en el .h y se implementan en el .m

sábado 4 de febrero de 12

2. INICIALIZADORES

Al principio del capítulo hablamos que con alloc reservamos memoria para una variable y nos devolvía un puntero a esa posición de memoria, y con init inicializamos el objeto.

Coche *miCoche = [[Coche alloc] init];

A veces es necesario crear nuestros propios métodos de inicialización:

Persona *persona = [[Persona alloc] initWithName:@”Pepe” dni:@”111111P”];

-(id)initWithName:(NSString *)nombre dni:(NSString *)dni{ [super init]

self.nombre = nombre;self.dni = dni;

}

sábado 4 de febrero de 12

2. INICIALIZADORES

id: representa un puntero a cualquier objeto. Los métodos init se declaran siempre devolviendo el parámetro id.

super: representa a la superclase.

self: es una variable local implícita, apunta al objeto donde se ha declarado.

sábado 4 de febrero de 12

2. MÉTODOS DE CLASE

Mientras que los métodos de instancia como init, son enviados a la instancia del objeto, los métodos de clase, como alloc, son enviados directamente a la clase.

Se usan para llamar a un método de una clase sin tener que crear una instancia de ella.

Se declaran con el ‘+’ delante: +(int)calcularEdad;

Se llaman sin crear la instancia:int edad = [Persona calcularEdad];

sábado 4 de febrero de 12

2. DESAFIO

Crear un programa que recorra un array de strings y muestre cada elemento con NSLog.

Crea un bug en tu programa, preguntando por una posición de memoria que no existe y contempla el error que se produce.

sábado 4 de febrero de 12

3. GESTIÓN DE MEMORIA CON ARC

Es muy importante conocer la gestión de memoria.

Objective-C en iOS al contrario que en mac, no tiene recolector de basura, por lo que seremos nosotros los que nos ocupemos de liberar la memoria.

Dispositivos con poca capacidad de memoria.

Los dos principales problemas son:

- dealloc prematuro- memory leak

sábado 4 de febrero de 12

3. GESTIÓN DE MEMORIA CON ARC

ARC: Automatic Reference Counting

Evitamos tener que liberar memoria de forma manual y el tiempo que perdemos buscando memory leaks.

ARC es un paso de pre-compilación que añade retain/release/autorelease sin tener que añadirlo tú.

A pesar de eso, no nos podemos olvidar de la gestión de memoria por completo.

sábado 4 de febrero de 12

3. GESTIÓN DE MEMORIA CON ARC

sábado 4 de febrero de 12

3. PILA

Cuando creamos un objeto usando alloc/init, a nuestro contador de referencias se le añade un 1:NSObject *obj = [[NSObject alloc] init];

Cuando liberamos el objeto, el contador de referencias vuelve a 0.[obj release];

sábado 4 de febrero de 12

3. ARC Y EL TIEMPO DE VIDA DE UN OBJETO

Cuando habilitamos ARC nuestro código queda de la siguiente manera:NSObject *obj = [[NSObject alloc] init];

Esto no significa que el contador de referencias desaparezca, sino que es automático.

Cuando el precompilador considera que el objeto no se va a usar más, añade automáticamente una línea para liberar ese objeto:[obj release];

sábado 4 de febrero de 12

3. PROPIEDADES

Antes de ARC, el compilador gestionaba la memoria de las propiedades públicas usando los parámetros de la directiva @property con assign, retain y copy.

Con las propiedades indicamos, si en la asignación de un nuevo valor debía: - liberarse la antigua referencia y retenerse la nueva (retain)- asignarse simplemente (assign), caso de los tipos primitivos (float, int) o estructuras (como NSRect).- o bien el copiado de objetos que nos permite tener un objeto fresco con el valor “congelado” de otro (copy).

Estos parámetros ya no se utilizan en la ARC. En su lugar tenemos los parámetros débil / fuerte para indicar al compilador cómo queremos tratar nuestras propiedades.

sábado 4 de febrero de 12

3. REFERENCIAS FUERTES

Se utiliza el atributo strong.

Especifica que hay una relación de propiedad (fuerte) sobre el objeto de destino.

Sin ARC:@property(retain) NSObject *obj;

Con ARC:@property(strong) NSObject *obj;

sábado 4 de febrero de 12

3. REFERENCIAS DÉBILES

Se utiliza el atributo weak.

Especifica que hay una relación de no-propiedad (débil) sobre el objeto de destino. Contamos con la ventaja de que si el objeto en cuestión resulta desalojado de la memoria (dealloc), entonces el valor de la propiedad se ajustará automáticamente a nil y, por tanto, en ningún caso se producirá un cuelgue del programa dado que el lenguaje permite enviar mensajes a nil.

@property(weak) NSObject *obj;

sábado 4 de febrero de 12

3. @AUTORELEASEPOOL

Otra de las incorporaciones es la correspondiente a la nueva directiva @autoreleasepool, que sustituye la clase NSAutoreleasePool convencional para la gestión de todos aquellos objetos sobre los que se haya aplicado un autorelease.

NSAutoreleasePool es costoso de desarrollar y todo se simplifica a:@autoreleasepool{ código}

Así de simple; y de hecho la documentación de Apple indica que su uso es incluso más eficiente en comparación con la propia clase a la que viene a sustituir.

sábado 4 de febrero de 12