Vous êtes sur la page 1sur 58

Curso de desarrollo iOS

(principiante)

sbado 4 de febrero de 12

PROFESORES

Ricardo Castellanos
ricardo@atomicflavor.com
twitter: @ricardocahe

sbado 4 de febrero de 12

Miguel Jos Garca Corchero


miguel@atomicflavor.com
twitter: @miguelgarciacor

HORARIO
9:30 - 11:00
11:00 - 11:30 Break
11:30 - 13:00
13:00 - 14:30
14:30 - 15:30 Break
15:30 - 17:30
17:30 - 18:00 Break
18:00 - 19:00

sbado 4 de febrero de 12

DA 1
A Simple iOS Application
Objective-C
Managing memory with ARC

sbado 4 de febrero de 12

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

sbado 4 de febrero de 12

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

sbado 4 de febrero de 12

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

sbado 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 grficos para nuestra aplicacin
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 programacin basado en C, y que ha sido modificado para poder
trabajar orientado a objetos, con lo cual puedes crear clases, objetos, variables de
instancias, mtodos, utilizar encapsulacin, etc.

sbado 4 de febrero de 12

CMO VAMOS A APRENDER??

Mimicry: accin de aprender imitando a alguien o algo


Explicacin
Ejemplo
Prctica

sbado 4 de febrero de 12

1. UNA APLICACIN SIMPLE


Qu pasa cuando arranca una aplicacin iOS?
Window - View
SDK iOS: librera orientada a objetos. Las ventanas y las
vistas se representan como objetos.

sbado 4 de febrero de 12

GESTIN DE VISTAS

sbado 4 de febrero de 12

CICLO DE VIDA
Delegate

Vista

Controlador

Inicio
Inicio {AbrirTitulo()}

AbrirTitulo()

Boton {Preferencias()}

AbrirPreferencias()

Fin
sbado 4 de febrero de 12

Preferencias()

1. PATRN MVC

El modelo-vista-controlador es un patrn arquitectnico. 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 presentacin, por
otro la lgica de aplicacin y por otro la informacin del dominio.

sbado 4 de febrero de 12

1. PATRN MVC - MODELO


El modelo encapsula los datos especficos de una
aplicacin y define la lgica y los proceso de computo
que manipulan esos datos. Muchos de estos datos son
el estado de la parte persistente de la aplicacin.
Como los objetos de modelo representan conocimiento y
experiencia respecto a un determinado dominio de
problema, pueden reusarse en problemas con un
dominio similar.

sbado 4 de febrero de 12

1. PATRN MVC - MODELO


Los objetos de dominio son clases donde almacenamos
la informacin de nuestro programa en tiempo de
ejecucin. Tambin la lgica 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.

sbado 4 de febrero de 12

1. PATRN 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 slo a travs del controlador.

sbado 4 de febrero de 12

1. PATRN MVC - VISTA


La vista la crearemos en nuestro fichero.xib. Para la
creacin de la vista utilizaremos Interface Builder y la
construiremos a base de widgets predefinidos del
framework Cocoa Touch o a travs de widgets propios.

sbado 4 de febrero de 12

1. PATRN MVC - CONTROLADOR

Un controlador es un objeto que actu de intermediario


entre una o mas vistas de aplicaciones y uno o ms
modelos de dominio. El controlador es como un
conducto a travs del cual los objetos se informan del
cambio en la interface y viceversa. Los Controladores
tambin pueden ajustar tareas de la aplicacin y
manejar el ciclo de vida de los objetos.

sbado 4 de febrero de 12

1. PATRN MVC - CONTROLADOR


El controlador emplea el patrn fachada, actuando como
una capa intermedia que aglutina 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.
Tambin los objetos que asociaremos a objetos de la
interface y los mtodos que se llamaran desde los
objetos de la interface.

sbado 4 de febrero de 12

1. CREAR UN PROYECTO CON XCODE


HOLA MUNDO
Una buena forma de familiarizarse con los lenguajes de
programacin y con los entornos de desarrollo es crear una
aplicacin sencilla que muestre un mensaje en pantalla. Estos
pequeos programas se crean usando la frase Hola Mundo casi
como un estndar, as que manos a la obra.
Abrimos XCode:

sbado 4 de febrero de 12

1. CREAR UN PROYECTO CON XCODE


Creamos un nuevo proyecto:

Seleccionamos el tipo de proyecto:

sbado 4 de febrero de 12

1. CREAR UN PROYECTO CON XCODE


Elegimos un nombre para el proyecto (HolaMundo).
Aadimos un nuevo fichero al proyecto.
Elegimos UIViewController y seleccionamos la opcin 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.

sbado 4 de febrero de 12

1. CREAR EL INTERFAZ
Abrimos el Interface Builder y aadimos un Label:

sbado 4 de febrero de 12

1. DECLARACIONES
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

sbado 4 de febrero de 12

1. IMPLEMENTAR MTODOS
Cargamos la vista al cargar la aplicacin:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
mensajeController=[[MensajeController
alloc]initWithNibName:@"MensajeController" bundle:nil];
[window addSubview:mensajeController.view];
[self.window makeKeyAndVisible];
return YES;
}

sbado 4 de febrero de 12

1. CONFIGURAR PUNTEROS
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 aadimos:


@synthesize mensaje;
sbado 4 de febrero de 12

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

sbado 4 de febrero de 12

1. CONFIGURAR ACCIONES Y OBJETOS


Aadimos un texto cualquiera al label al inicio. Esto se hace en el
mtodo saludar del controlador:
- (void)saludar
{!
!
[mensaje setText:@"Hola Mundo"];
}

sbado 4 de febrero de 12

1. RESUMEN DE CONECTORES
Desde el Files Owner, nuestros conectores se deben de quedar
configurados de la siguiente manera:

sbado 4 de febrero de 12

1. COMPILAR Y EJECUTAR
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 botn.

sbado 4 de febrero de 12

1. DESPLEGAR LA APLICACIN

Ahora que sabemos probar nuestra aplicacin en el simulador, es


hora de probarla en el dispositivo.
Necesitamos un certificado de desarrollador.
Asignar el Bundle Identifier (App Id): com.atomicflavor.example
Perfil de aprovisionamiento: example.mobileprovision

sbado 4 de febrero de 12

1. ICONOS DE LA APLICACIN
Es muy importante el diseo del icono, ya que es lo primero que
va a ver el posible comprador de la aplicacin.
Tamaos:
iPhone/iPod Touch sin Retina display: 57x57 pixels
iPhone/iPod Touch con Retina display: 114x114 pixels
iPad: 72x72 pixels

sbado 4 de febrero de 12

1. ICONOS DE LA APLICACIN
Para insertar los iconos, arrastramos a:

sbado 4 de febrero de 12

1. CARGAR IMGENES
Podemos cargar imgenes al arrancar la aplicacin.
Tamaos:
iPhone/iPod Touch sin Retina display: 320x480 pixels
iPhone/iPod Touch con Retina display: 640x960 pixels
iPad: 1024x768 pixels

sbado 4 de febrero de 12

2. OBJECTIVE-C

Las aplicaciones de iOS se desarrollan en Objective-C


Objective-C es una extensin del lenguaje C
Cocoa Touch son un un conjunto de clases en Objective-C

sbado 4 de febrero de 12

2. OBJETOS
Coche
int numRuedas; //Atributo
-(int) getNumRuedas; //Mtodo
-(void) setNumRuedas:(int)n;
- Clase: propiedad y comportamiento de un objeto concreto.
- Objeto: es una instancia a una clase.
- Atributo: propiedad del objeto.
- Mtodo: es lo que un objeto puede hacer. Algoritmo.
- Evento: interaccin del usuario con la mquina.
- Mensaje: comunicacin dirigida a un objeto ordenndole que
ejecute uno de sus mtodos.

sbado 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 comn usarlos juntos:
NSMutableArray *listaPersonas = [[NSMutableArray alloc] init];

sbado 4 de febrero de 12

2. ENVIAR MENSAJES

- Mensaje: comunicacin dirigida a un objeto ordenndole que ejecute


uno de sus mtodos.
NSMutableArray *listaPersonas = [[NSMutableArray alloc] init];
[listaPersonas addObject:personaX];

sbado 4 de febrero de 12

2. DESTRUIR OBJETOS
Para destruir objetos se usa el mensaje release.
[listaPersonas release];
Esta instruccin 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;

sbado 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 tambin se podra hacer:
NSString *cadena = [[NSString alloc] initWithString:@Hola Mundo];

sbado 4 de febrero de 12

2. NSARRAY Y NSMUTABLEARRAY

Un array es una coleccin de objetos. Es una lista ordenada de objetos


a la que se puede acceder a travs de un ndice.
NSArray una vez que se ha instanciado, no se pueden aadir o borrar
objetos.
NSMutableArray, es un array dinmico al que podemos aadir o
borrar objetos en cualquier momento.

sbado 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.

sbado 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 estn vinculadas con dicha clase
hacindolas propias de esa instancia y solamente pudindose
acceder a ellas a travs del identificador del objeto.
@interface Persona : NSObject {
NSString *nombre;
NSString *dni;
int edad;
}
@end

sbado 4 de febrero de 12

2. MTODOS 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 mtodos de acceso.
Tambin llamados getter y setter:
-(NSString *) getNombre{
return nombre;
}
-(void) setDni:(NSString *)newDni{
dni = newDni;
}

sbado 4 de febrero de 12

2. MTODOS DE INSTANCIA
Adems de los mtodos de acceso, tenemos otros mtodos que nos ayudan
a resolver otras tareas.
Por ejemplo, el mtodo -(bool)validarDni; lo usaremos para validar el dni de
un objeto de clase Persona.
Los mtodos de instancia se suelen declarar en el .h y se implementan en
el .m

sbado 4 de febrero de 12

2. INICIALIZADORES
Al principio del captulo hablamos que con alloc reservamos memoria para una
variable y nos devolva un puntero a esa posicin de memoria, y con init
inicializamos el objeto.
Coche *miCoche = [[Coche alloc] init];
A veces es necesario crear nuestros propios mtodos de inicializacin:
Persona *persona = [[Persona alloc] initWithName:@Pepe dni:@111111P];
-(id)initWithName:(NSString *)nombre dni:(NSString *)dni
{
[super init]
self.nombre = nombre;
self.dni = dni;
}

sbado 4 de febrero de 12

2. INICIALIZADORES
id: representa un puntero a cualquier objeto. Los mtodos init se declaran
siempre devolviendo el parmetro id.
super: representa a la superclase.
self: es una variable local implcita, apunta al objeto donde se ha declarado.

sbado 4 de febrero de 12

2. MTODOS DE CLASE
Mientras que los mtodos de instancia como init, son enviados a la instancia
del objeto, los mtodos de clase, como alloc, son enviados directamente a la
clase.
Se usan para llamar a un mtodo 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];

sbado 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 posicin de memoria que
no existe y contempla el error que se produce.

sbado 4 de febrero de 12

3. GESTIN DE MEMORIA CON ARC


Es muy importante conocer la gestin 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

sbado 4 de febrero de 12

3. GESTIN 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-compilacin que aade retain/release/autorelease sin
tener que aadirlo t.
A pesar de eso, no nos podemos olvidar de la gestin de memoria por
completo.

sbado 4 de febrero de 12

3. GESTIN DE MEMORIA CON ARC

sbado 4 de febrero de 12

3. PILA

Cuando creamos un objeto usando alloc/init, a nuestro contador de


referencias se le aade un 1:
NSObject *obj = [[NSObject alloc] init];
Cuando liberamos el objeto, el contador de referencias vuelve a 0.
[obj release];

sbado 4 de febrero de 12

3. ARC Y EL TIEMPO DE VIDA DE UN


OBJETO
Cuando habilitamos ARC nuestro cdigo queda de la siguiente manera:
NSObject *obj = [[NSObject alloc] init];
Esto no significa que el contador de referencias desaparezca, sino que es
automtico.
Cuando el precompilador considera que el objeto no se va a usar ms, aade
automticamente una lnea para liberar ese objeto:
[obj release];

sbado 4 de febrero de 12

3. PROPIEDADES
Antes de ARC, el compilador gestionaba la memoria de las propiedades
pblicas usando los parmetros de la directiva @property con assign, retain y
copy.
Con las propiedades indicamos, si en la asignacin de un nuevo valor deba:
- 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 parmetros ya no se utilizan en la ARC. En su lugar tenemos los
parmetros dbil / fuerte para indicar al compilador cmo queremos tratar
nuestras propiedades.

sbado 4 de febrero de 12

3. REFERENCIAS FUERTES

Se utiliza el atributo strong.


Especifica que hay una relacin de propiedad (fuerte) sobre el objeto de
destino.
Sin ARC:
@property(retain) NSObject *obj;
Con ARC:
@property(strong) NSObject *obj;

sbado 4 de febrero de 12

3. REFERENCIAS DBILES

Se utiliza el atributo weak.


Especifica que hay una relacin de no-propiedad (dbil) sobre el objeto de
destino. Contamos con la ventaja de que si el objeto en cuestin resulta
desalojado de la memoria (dealloc), entonces el valor de la propiedad se
ajustar automticamente a nil y, por tanto, en ningn caso se producir un
cuelgue del programa dado que el lenguaje permite enviar mensajes a nil.
@property(weak) NSObject *obj;

sbado 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 gestin de todos aquellos objetos sobre los que se haya aplicado un
autorelease.
NSAutoreleasePool es costoso de desarrollar y todo se simplifica a:
@autoreleasepool
{
cdigo
}
As de simple; y de hecho la documentacin de Apple indica que su uso es
incluso ms eficiente en comparacin con la propia clase a la que viene a
sustituir.

sbado 4 de febrero de 12