introducción a objectivec e ios

Post on 03-Nov-2014

8 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

Una introducción al desarrollo de aplicaciones en iOS usando Objective-C. La mayor parte es explicación de conceptos de Objective-C para desarrolladores que vengan de .NET

TRANSCRIPT

Eduard Tomàs

Introducción al desarrollo en iOS para desarrolladores .NET

Master RIATec10 apr

www.pasiona.com(+34) 669 333 333info@pasiona.com

@pasiona BarcelonaPujades 350, 10ª planta

08019 · Barcelona

BilbaoGran Vía 19-21, 2ª planta

48008 · Bilbao

Londres1 Northumberland Avenue

London · WC2N 5BW

MadridPinar 5,

28006 · Madrid

Conocimientoadquirido a través de la realización de proyectos, formación e innovación tecnológica

Innovaciónligada a la mejora continua y basadaen las nuevas oportunidades tecnológicas

Tecnologíasoluciones a cada una de las necesidadesempresariales que se platean en cada ámbito

Valores humanosguía de lo que hacemos y pretendemosque nos enseña y nos conduce día a día

Pasiónsomos grandes entusiastas de todo aquello que creamos y vemos crecer

Experienciao la garantía de la habilidad derivada de años de vivencias y observación

Microsoftsocio 100% alineado partner 100% especializado

Desarrollocapacidad para realizar proyectos deámbito tecnológico con un fin de mejora

Especializaciónofrecemos soluciones a medida con las mejores herramientas tecnológicas

Qué es

SocialMedia

Servicios profesionales

Consultoría Proyectos

Innovación Azure

Formación

Auditoría

Servicios

Eduard Tomàs

@eiximenis

Key Consultant en pasiona ConsultingDivulgador Tecnológico en Fundación Techdencias

etomas@pasiona.comeiximenis@techdencias.net

Agenda

Un nuevo entorno: XCode

Un nuevo lenguaje: ObjectiveC

Modelo de desarrollo de aplicaciones iOS

Tema 1Un nuevo entorno: XCode

XCode

Xcode juega en iOS/MacOS el rol de

Visual Studio IDE completo para desarrollar

aplicaciones iOS y MacOS Lenguajes: C/C++, ObjectiveC

Tema 2Un nuevo lenguaje: ObjectiveC

Objective-C Conocido popularmente como “C with

classes” NO es C++, NO tiene nada que ver con

C++ Soporte para

OOP (Clases, interfaces, herencia…), Programación dinámica Gestión manual, semi-automática o

automática (GC) de memoria

Objective-C: Tipos simples A diferencia de .NET en objectiveC

existen tipos simples que NO son objetos

(char, int, float, double, long, struct,…) Para tratar con objetos NO se usan

referencias, se usan punteros

Objective-C: Tipos simples No existe un tipo booleano. Se usa:

BOOL (typedef signed char) YES / NO (#defines a 1 y 0)

El if() de ObjectiveC se evalúa a true si el

valor es !=0 y a false si es 0.

Objective-C: Tipos simples Las structs de ObjectiveC no tienen

NADA que ver con las de .NET No pueden tener métodos No pueden tener datos privados

Son las structs de C!

Objective-C: Tipos simples Los arrays de ObjectiveC son parecidos a

los de .NET salvo que: No existen jagged arrays El nombre del array es un puntero a su

primer elemento

Objective-C: Tipos simples En ObjectiveC existen los punteros

Imprescinbibles para tratar con

objetos (NO hay referencias). La llamada a alloc devuelve un

puntero Para declarar un puntero se usa Tipo* El valor nil (o NULL) significa que el

puntero apunta a nada.

Objective-C: Clases Mismo concepto que la clase de C#

Se define en dos archivos (.h y .m) .h contiene la interfaz (@interface) de

la clase NADA que ver con interface de C#

Objective-C: Clases Ejemplo (.h)#import <Foundation/Foundation.h> @interface Person : NSObject - (void)sayHello; @end

Ejemplo (.m)#import "Person.h" @implementation Person - (void)sayHello {

NSLog(@"Hello, my name is HAL."); } @end

Objective-C: Instanciación NO existe operador new Instanciar un objeto es un proceso en 2

pasos Llamar al método alloc Llamar al método init En ObjectiveC no hay constructores.

Se usa init() para código de

inicialización custom

Objective-C: Instanciación Ejemplo:Person *somePerson = [Person alloc]; [somePerson init];

Aunque se suele combinar alloc e init:Person *somePerson = [[Person alloc] init];

Los corchetes ([ ]) son el operador de

envío de mensajes Equivale a llamar a un método en C#

Objective-C: Parámetros Forman parte del nombre del método Tienen un nombre “externo” y otro

interno- (void)sayHelloToName:(NSString *)aName;

- (void)sayHelloToName:(NSString *)aName { NSLog(@"Hello %@, my name is HAL.", aName);}

[somePerson sayHelloToName:@"Bill"];

Objective-C: Parámetros -(NSNumber*) addWithTwoNumbers:(NSNumber *)first

secondNumber:(NSNumber *)second;

NSNumber* -> Tipo de vuelta

addWithTwoNumbers: -> Nombre método + externo

param 1

(NSNumber*)first -> Tipo param 1 y nombre interno

secondNumber: -> nombre externo param 2

(NSNumber*)second -> Tipo param 2 y nombre interno

Objective-C: Parámetros -(NSNumber*) addWithTwoNumbers:(NSNumber *)first

secondNumber:(NSNumber *)second;

El nombre de este método es:

addWithTwoNumbers:secondNumber:

Sobre este nombre se podría crear un selector para

invocarlo dinámicamente

Objective-C: Propiedades Las clases de ObjectiveC pueden tener

propiedades@property (copy) NSString *name;

Se pueden auto-implementar (en el .m)

con: @synthesize name = _name;

@synthesize genera los métodos set y

get (llamados setName y name en este

caso)

Objective-C: Propiedades Podemos implementarlas nosotros:@property unsigned int age;

- (unsigned int)age { return _age; } - (void)setAge:(unsigned int)age { _age = age; }

Objective-C: Propiedades Debemos añadir la variable de instancia

(_age). Podemos hacerlo en: @interface y que sea pública o

protegida @implementation y que sea privada

@implementation Person { unsigned int _age; }

Objective-C: Propiedades Recuerda que los getters y setters son

métodos, por lo tanto se invocan

mediante paso de mensajes (corchetes)

Aunque SOLO para las propiedades

existe la posibilidad de usarlas mediante

la notación de punto (.)

Objective-C: Memoria La gestión de memoria es uno de los

grandes quebraderos en ObjectiveC. Hay

3 modelos: Manual Semi-automática (ARC, Automatic

Reference Counting) Automática (GC, Garbage Collector)

La última NO puede usarse en iOS

Objective-C: Memoria El runtime de ObjectiveC lleva una

cuenta de cuantas referencias apuntan a

un objeto. Si este contador llega a 0 el

objeto puede ser destruido. La diferencia entre ARC y la gestión

manual es quien actualiza este contador.

Objective-C: Memoria La gestión manual se basa en cuatro

métodos alloc: reserva memoria y suma uno al

contador de referencias del objeto retain: Suma uno al contador de

referencias del objeto release y autorelase: Decrementa en

uno el contador de referencias

Objective-C: Memoria La idea de la gestión manual es muy

simple: El número de veces que se “reclama”

un objeto (alloc, retain) debe ser igual

al número de veces que se libera

(release, autorelase) Por cada llamada a alloc/retain debe

haber una llamada a release o

autorelease.

Objective-C: Memoria Usar un objeto DESPUÉS de que haya

sido liberado es un error y suele ser

catastrófico No liberar un objeto nunca genera un

memory-leak

Objective-C: Memoria La gestión manual es muy simple en

objetos de la pila pero se complica

cuando se pasan objetos entre ellos (p.

ej. en propiedades). Cuidado al usar weak-references! (Al

guardar un puntero a un objeto sin

llamar a retain).

Objective-C: Memoria La diferencia entre release y autorelease

es que el primero decrementa al acto el

contador y el segundo se espera al final

del autoreleasepool actual. @autoreleasepool {...NSLog(@"Hello, World!");/* En este punto se decrementan todos los contadores afectados por autorelease */}

Objective-C: Memoria Para las propiedades podemos indicar

como queramos que se comporten: assign: Crea una weak reference retain: Crea una strong reference copy: Copia el objeto (clona)

@property (retain) Person *captain;

Objective-C: ARC Por suerte nos podemos olvidar de la

gestión manual de memoria gracias a

ARC que sí que está soportado en iOS

NO hay ningún motivo para NO usar ARC

y usar la gestión manual de memoria!

Objective-C: ARC La primera norma al usar ARC es muy

simple: NO llamar NUNCA a retain, release o

autorelease. Nunca. Jamás. Desde este punto de vista, puedes

actuar como si tuvieses un GC

Objective-C: ARC Para las propiedades NO usaremos

assign o retain, en su lugar usaremos: weak: Para especificar una propiedad

mediante weak reference strong: Para especificar una propiedad

mediante strong reference

Objective-C: ARC ARC evita que un puntero que apunta a

un objeto eliminado siga apuntando a un

espacio de memoria “inválido” y lo

asigna a nil.

Objective-C: Métodos estáticos ObjectiveC soporta métodos estáticos.

Son los que empizan por + en su

declaración:@interface Person : NSObject @property (copy) NSString *name; - (void)sayHello;+ (Person *)personWithName:(NSString *)name; @end

El método personWithName es un

método estático

Objective-C: Métodos init Si quieres crear un método init propio

debes declararlo que devuelve id:- (id)init { self = [super init]; if (self) { _ammo = 1000; } return self; }

self es el equivalente de this en C# y

super es el equivalente de base en C#

Objective-C: Nombres En Objective-C se busca que los nombres

de los métodos sean lo más informativos

posibles No uses:- (id)shoot:(Ship *)aShip; Usa mejor:- (id)shootOtherShip:(Ship *)aShip;

Objective-C: Initialize El método estático initialize juega el

mismo rol que el constructor estático en

C#static Ship *_sharedShip; + (void)initialize { if (self == [Ship class]) { _sharedShip = [[self alloc] init]; } } + (Ship *)sharedShip { return _sharedShip; }

Objective-C: Métodos privados Objective-C NO tiene métodos privados. Se simulan NO colocando el método en

la interfaz (@interface) de la clase Recuerda: Los “usuarios” de una clase

solo tienen acceso a su interfaz.

Objective-C: Categorías Una categoría ofrece un conjunto de métodos adicionales

sobre una clase. Lo más parecido que tiene C# son los

métodos de extensión

Los métodos definidos en la categoría

Pueden usar los métodos de la clase que categorizan

Se pueden llamar con un puntero a la clase

categorizada

Objective-C: Categorías Las categorías se declaran como una clase cuyo nombre

es ClaseQueSeExtiende (NombreCategoría):

Se definen como clases normales (@interface e

@implementation)

Dentro de una categoria

self se refiere al objeto de la clase que se extiende

Objective-C: Métodos protected Objective-C NO tiene el concepto de

métodos protegidos Se pueden simular colocándolos todos en

una categoría e incluir el .h de dicha

categoría tan solo en las clases hijas.

Objective-C: Protocolos Un protocolo es un conjunto de métodos

que una clase debe implementar. Son como los interfaces de C# salvo que

un protocolo puede tener métodos

“opcionales”. Una clase puede adoptar varios

protocolos (al igual que en C#

implementar varias interfaces)

Objective-C: Protocolos La definición es con @protocol:@protocol CoordinateSupport <NSObject> @property double x;- (NSArray *)arrayFromPosition; - (double)magnitude; @end

La notación angular (<>) indica herencia

de protocolos (CoordinateSupport hereda

del protocolo NSObject)

Objective-C: Protocolos Para que una clase adopte un protocolo

se usa la notación angular:@interface Person : NSObject <CoordinateSupport> @property (copy) NSString *name; @property (strong) NSMutableSet *friends; - (void)sayHello; - (void)sayGoodbye; @end

Este código NO es correcto hasta que

Person no implemente los métodos del

protocolo

Objective-C: Protocolos Al igual que las interfaces en C# un

protocolo define un tipo por si mismo. Aunque en Objective-C es un pesudo-

tipo. Se puede indicar que un parámetro debe

adoptar un protocolo:- (double)getDistanceFromObject:(id <CoordinateSupport>)theObject;

Tema 3Modelo de desarrollo de aplicaciones iOS

iOS – Modelo MVC Una aplicación iOS se construye

mediante el patrón MVC Modelo: Datos de la aplicación View: Vista que muestra los datos (nib

file) Controller: Clase que enlaza la vista

con el modelo

iOS – Vistas Ficheros nib (.xib) Contienen los controles de la vista, sus

propiedades y los enlaces de eventos Equivaldría al XAML de WPF o a al

Form.Designer.cs de Winforms

iOS – Controladores Contienen outlets y acciones

Outlet: Puntero que apunta a un

control de la vista controlada Action: Método llamado por un control

de la vista Outlets y acciones se asocian mediante

XCode

iOS – Controles son vistas Conceptualmente los controles iOS son

vistas Algunos tienen su propio controlador

Caso de controles “complejos”

iOS – App Delegate Clase encargada de inicializar la

aplicación. Crea la vista inicial y su controlador Coloca la vista inicial en la ventana

Tiene métodos para que iOS le informe

de ciertos casos (fin de aplicación, paso

a back, etc) Equivale a la clase App de WPF

iOS – Aplicación single-view Contiene:

Una vista (fichero .xib) Un controlador Un application delegate

iOS – Rotación Puede ser:

1. Automática

2. Reposición de controles manual

3. Mediante dos vistas (landscape y

portrait) 90% de aplicaciones tendrán

sufienciente con (1)

iOS – Rotación automática iOS rota las vistas automáticamente Para que los controles se reposicionen

correctamente deben establecerse las

restricciones de posición Funcionan de forma parecida a la

propiedad Anchor de Winforms o

Margin de WPF

iOS – Reposición manual Para layouts complejos puede ser

necesario reposicionar los controles

manualmente Usar método

willAnimateRotationToInterfaceOrientation del

controlador para posicionar los controles

en su nueva posición

iOS – Rotación: dos vistas Para vistas complejas o funcionalidades

distintas según orientación deberemos

usar dos vistas Usar método

willAnimateRotationToInterfaceOrientation del

controlador para cambiar la vista según

la orientación ¡Tener presente que todo está duplicado!

iOS – Aplicaciones multivista Constan de:

N vistas (.xib) secundarias N controladores Una vista principal con el control que

permite el cambio de vista (ej Toolbar)

y que realiza el cambio El controlador de la vista principal

iOS – Control TableView Necesita un delegado

(UITableViewDelegate)

y un DataSource

(UITableViewDataSourc

e)

iOS – Control TableView Lista de datos

Agrupaciones

de datos

Siempre tiene

1 columna

Personalizable

iOS – Control TableView Necesita un delegado

(UITableViewDelegate)

y un DataSource

(UITableViewDataSourc

e)

iOS – Storyboards Permiten definir el flujo de una aplicación

de forma gráfica “Agrupan” varios ficheros nib en uno solo Solo iOS 5 o superior

Eduard Tomàs@eiximenis

etomas@pasiona.comeiximenis@techdencias.net

Gracias!

top related