SlideShare una empresa de Scribd logo
Eduard Tomàs
Introducción al desarrollo en
 iOS para desarrolladores
.NET
Master RIATec
10 apr
www.pasiona.com
info@pasiona.com
(+34) 669 333 333
@pasiona            Barcelona                 Bilbao                      Madrid           Londres
                    Pujades 350, 10ª planta   Gran Vía 19-21, 2ª planta   Pinar 5,         1 Northumberland Avenue
                    08019 · Barcelona         48008 · Bilbao              28006 · Madrid   London · WC2N 5BW
Qué es



Microsoft                                 Innovación                                      Pasión
socio 100% alineado                       ligada a la mejora continua y basada            somos grandes entusiastas de todo
partner 100% especializado                en las nuevas oportunidades tecnológicas        aquello que creamos y vemos crecer


Desarrollo                                Tecnología                                      Experiencia
capacidad para realizar proyectos de      soluciones a cada una de las necesidades        o la garantía de la habilidad derivada
ámbito tecnológico con un fin de mejora   empresariales que se platean en cada ámbito     de años de vivencias y observación


Especialización                           Conocimiento                                    Valores humanos
ofrecemos soluciones a medida con         adquirido a través de la realización de         guía de lo que hacemos y pretendemos
las mejores herramientas tecnológicas     proyectos, formación e innovación tecnológica   que nos enseña y nos conduce día a día
Servicios
Consultoría   Proyectos       Auditoría




              Servicios                    Social      Formación
              profesionales                Media



                                          Innovación    Azure
Eduard Tomàs
Key Consultant en pasiona Consulting
Divulgador Tecnológico en Fundación Techdencias


   @eiximenis
etomas@pasiona.com     eiximenis@techdencias.net
Agenda
Un nuevo entorno: XCode
Un nuevo lenguaje: ObjectiveC
Modelo de desarrollo de aplicaciones iOS
Tema 1
Un 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 2
Un 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 3
Modelo 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

                     (UITableViewDataSource)
iOS – Control TableView
                       Lista de datos

                       Agrupaciones de

                        datos

                       Siempre tiene 1

                        columna

                       Personalizable
iOS – Control TableView
                    Necesita un delegado

                     (UITableViewDelegate) y

                     un DataSource

                     (UITableViewDataSource)
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.com
eiximenis@techdencias.net



                            Gracias!

Más contenido relacionado

PPT
Intro classes(1)
PPT
Poo 2009 u2_introd_a_la_poo_2
PDF
Programacion Orientada a Obejtos C++
PPTX
PPTX
1 Introducción a los Lenguajes de Programación y a la Programación Orientada ...
PPTX
Practica 08
PPTX
Curso basico c sharp
Intro classes(1)
Poo 2009 u2_introd_a_la_poo_2
Programacion Orientada a Obejtos C++
1 Introducción a los Lenguajes de Programación y a la Programación Orientada ...
Practica 08
Curso basico c sharp

La actualidad más candente (20)

PDF
Definición de clases en POO
PPT
PDF
Programación orientada a objetos con c++
DOCX
PPT
Adentrándonos a PHP 5
PPT
Polimorfismo en Java
PPTX
Intro
PDF
Curso iOS
PPT
Polimorfismo
PPT
PPT
Des.Apli.Net 02.Sintaxis C Sharp
PDF
Buenas prácticas para la construcción de software
PDF
Javascript Módulo 5 - javascript sentencia, expresión, variable, función - Un...
PPT
10 sintaxis oo
PPTX
Programacion orientada a objetos Java
PPT
Introduccion
PDF
Tipos Datos y Operadores en Visual C# (C sharp)
PPTX
Fundamento de poo en php
PPTX
Programacion kmi
PPT
Fundamentos de programación Java
Definición de clases en POO
Programación orientada a objetos con c++
Adentrándonos a PHP 5
Polimorfismo en Java
Intro
Curso iOS
Polimorfismo
Des.Apli.Net 02.Sintaxis C Sharp
Buenas prácticas para la construcción de software
Javascript Módulo 5 - javascript sentencia, expresión, variable, función - Un...
10 sintaxis oo
Programacion orientada a objetos Java
Introduccion
Tipos Datos y Operadores en Visual C# (C sharp)
Fundamento de poo en php
Programacion kmi
Fundamentos de programación Java
Publicidad

Destacado (20)

PPTX
Introducción al desarrollo de videojuegos 2D con Wave Engine
PPTX
JavaScript - HTML5 - IndexedDb
PPTX
Microsoft Code Contracts
PPTX
Winobjc - Windows Bridge for iOS
PPTX
Asp.Net vNext - La revolución que viene
PPTX
Aplicaciones Metro UI para Windows8 con C# y XAML (12 horas Visual Studio)
PPTX
Introducción a ReactJS
PPTX
EcmaScript unchained
PPTX
MongoDb (BcnDevCon Nov 2011)
PPTX
#netIO 1 - Ecosistema .NET
PPTX
React native - t3chfest 2016
PPTX
ASP.NET vNext... Desarrollo cross platform
PPTX
Interfaces rest
PPTX
Handlebars
PPTX
Una tapa de ecmascript 6
PPTX
React native - Unleash the power of your device
PPTX
Vista aérea de los lenguajes de programación
PPTX
Async / Await: Programación asíncrona para dummies (12 horas visual studio)
PPTX
JavaScript in 2016 (Codemotion Rome)
PPTX
Novedades de ASP.NET MVC6
Introducción al desarrollo de videojuegos 2D con Wave Engine
JavaScript - HTML5 - IndexedDb
Microsoft Code Contracts
Winobjc - Windows Bridge for iOS
Asp.Net vNext - La revolución que viene
Aplicaciones Metro UI para Windows8 con C# y XAML (12 horas Visual Studio)
Introducción a ReactJS
EcmaScript unchained
MongoDb (BcnDevCon Nov 2011)
#netIO 1 - Ecosistema .NET
React native - t3chfest 2016
ASP.NET vNext... Desarrollo cross platform
Interfaces rest
Handlebars
Una tapa de ecmascript 6
React native - Unleash the power of your device
Vista aérea de los lenguajes de programación
Async / Await: Programación asíncrona para dummies (12 horas visual studio)
JavaScript in 2016 (Codemotion Rome)
Novedades de ASP.NET MVC6
Publicidad

Similar a Introducción a ObjectiveC e IOS (20)

PDF
Iphone
PPTX
C# for Beginners
PPTX
Reglas de Código Simple
PDF
Met2 07 01-introduccion_poo
KEY
Ios.s2
PDF
POO Programación Orientada a Objetos
PDF
Aspect Oriented Programming introduction
PDF
Fundamentos de programacion
PPTX
Taller Campus Party 2011: Desarrollo de Aplicaciones con .NET (Sesión 1)
PDF
Clase numero 6
PDF
Desarrollo aplicaciones
PDF
200505 - Modelado de Software con UML
PDF
Programacion orientada objetos-1
PPTX
Sesion uno azuay
PPT
PDF
Introducción Curso iOS
PDF
Taller de iniciación a iOS
PPT
C# para desarrolladores VB6
PDF
Clean code 10-11
Iphone
C# for Beginners
Reglas de Código Simple
Met2 07 01-introduccion_poo
Ios.s2
POO Programación Orientada a Objetos
Aspect Oriented Programming introduction
Fundamentos de programacion
Taller Campus Party 2011: Desarrollo de Aplicaciones con .NET (Sesión 1)
Clase numero 6
Desarrollo aplicaciones
200505 - Modelado de Software con UML
Programacion orientada objetos-1
Sesion uno azuay
Introducción Curso iOS
Taller de iniciación a iOS
C# para desarrolladores VB6
Clean code 10-11

Más de Eduard Tomàs (20)

PPTX
Kubernetes: Do's, don'ts and why's
PPTX
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
PPTX
Escalando workloads serverless en Kubernetes con Keda
PPTX
C#9 - Más C# que nunca
PPTX
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
PPTX
Keda o como convertir Kubernetess en Serverless
PPTX
.NET Memoria y Rendimiento
PPTX
Containers en .NET (Dot Net 2018 - Spain)
PPTX
Esos contenedores, ¡a producción! (Commit Conf 2018)
PPTX
Codemotion 2015 - Bienvenido de nuevo c++
PPTX
El "peor" lenguaje del mundo
PPTX
Containerize a netcore application with aks
PPTX
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
PPTX
Aplicaciones de consola fáciles? Más quisieramos
PPTX
Serverless with Azure Functions and CosmosDb
PPTX
Docker y todo eso... más o menos
PPTX
Microservices: Yes or not?
PPTX
ASP.NET MVC Core
PPTX
Azure functions
PPTX
Asp.Net Core 1.0 Deep Dive
Kubernetes: Do's, don'ts and why's
KCDS 2021- Escalando workloads serverless en Kubernetes con KEDA
Escalando workloads serverless en Kubernetes con Keda
C#9 - Más C# que nunca
CollabDays 2020 Barcelona - Serverless Kubernetes with KEDA
Keda o como convertir Kubernetess en Serverless
.NET Memoria y Rendimiento
Containers en .NET (Dot Net 2018 - Spain)
Esos contenedores, ¡a producción! (Commit Conf 2018)
Codemotion 2015 - Bienvenido de nuevo c++
El "peor" lenguaje del mundo
Containerize a netcore application with aks
Escenarios avanzados en AKS (Global Azure Bootcamp Barcelona 2019)
Aplicaciones de consola fáciles? Más quisieramos
Serverless with Azure Functions and CosmosDb
Docker y todo eso... más o menos
Microservices: Yes or not?
ASP.NET MVC Core
Azure functions
Asp.Net Core 1.0 Deep Dive

Último (20)

PDF
La electricidad y la electrónica .pdf n
PPTX
Presentación de Redes de Datos modelo osi
PPTX
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
PDF
taller de informática - LEY DE OHM
PDF
ACTIVIDAD 2.pdf j
DOCX
Trabajo colaborativo Grupo #2.docxmmuhhlk
DOCX
Zarate Quispe Alex aldayir aplicaciones de internet .docx
PDF
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
PPTX
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PDF
Aristoteles-y-su-forma-de-entender-el-conocimiento-y-las-personas.pdf
PDF
diagrama de pareto.pdf valerie giraldo diaz
PDF
SAP Transportation Management para LSP, TM140 Col18
PPTX
Administración se srevidores de apliaciones
PDF
Liceo departamental MICRO BIT (1) 2.pdfbbbnn
PPT
introduccion a las_web en el 2025_mejoras.ppt
PPTX
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
PPTX
REDES INFORMATICAS REDES INFORMATICAS.pptx
PDF
clase auditoria informatica 2025.........
DOCX
Trabajo colaborativo Grupo #2.docxmkkkkkkl
PDF
Maste clas de estructura metálica y arquitectura
La electricidad y la electrónica .pdf n
Presentación de Redes de Datos modelo osi
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
taller de informática - LEY DE OHM
ACTIVIDAD 2.pdf j
Trabajo colaborativo Grupo #2.docxmmuhhlk
Zarate Quispe Alex aldayir aplicaciones de internet .docx
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Aristoteles-y-su-forma-de-entender-el-conocimiento-y-las-personas.pdf
diagrama de pareto.pdf valerie giraldo diaz
SAP Transportation Management para LSP, TM140 Col18
Administración se srevidores de apliaciones
Liceo departamental MICRO BIT (1) 2.pdfbbbnn
introduccion a las_web en el 2025_mejoras.ppt
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
REDES INFORMATICAS REDES INFORMATICAS.pptx
clase auditoria informatica 2025.........
Trabajo colaborativo Grupo #2.docxmkkkkkkl
Maste clas de estructura metálica y arquitectura

Introducción a ObjectiveC e IOS

  • 1. Eduard Tomàs Introducción al desarrollo en iOS para desarrolladores .NET Master RIATec 10 apr
  • 2. www.pasiona.com info@pasiona.com (+34) 669 333 333 @pasiona Barcelona Bilbao Madrid Londres Pujades 350, 10ª planta Gran Vía 19-21, 2ª planta Pinar 5, 1 Northumberland Avenue 08019 · Barcelona 48008 · Bilbao 28006 · Madrid London · WC2N 5BW
  • 3. Qué es Microsoft Innovación Pasión socio 100% alineado ligada a la mejora continua y basada somos grandes entusiastas de todo partner 100% especializado en las nuevas oportunidades tecnológicas aquello que creamos y vemos crecer Desarrollo Tecnología Experiencia capacidad para realizar proyectos de soluciones a cada una de las necesidades o la garantía de la habilidad derivada ámbito tecnológico con un fin de mejora empresariales que se platean en cada ámbito de años de vivencias y observación Especialización Conocimiento Valores humanos ofrecemos soluciones a medida con adquirido a través de la realización de guía de lo que hacemos y pretendemos las mejores herramientas tecnológicas proyectos, formación e innovación tecnológica que nos enseña y nos conduce día a día
  • 4. Servicios Consultoría Proyectos Auditoría Servicios Social Formación profesionales Media Innovación Azure
  • 5. Eduard Tomàs Key Consultant en pasiona Consulting Divulgador Tecnológico en Fundación Techdencias @eiximenis etomas@pasiona.com eiximenis@techdencias.net
  • 6. Agenda Un nuevo entorno: XCode Un nuevo lenguaje: ObjectiveC Modelo de desarrollo de aplicaciones iOS
  • 7. Tema 1 Un nuevo entorno: XCode
  • 8. XCode  Xcode juega en iOS/MacOS el rol de Visual Studio  IDE completo para desarrollar aplicaciones iOS y MacOS  Lenguajes: C/C++, ObjectiveC
  • 9. Tema 2 Un nuevo lenguaje: ObjectiveC
  • 10. 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
  • 11. 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
  • 12. 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.
  • 13. 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!
  • 14. 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
  • 15. 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.
  • 16. 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#
  • 17. 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
  • 18. 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
  • 19. 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#
  • 20. 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"];
  • 21. 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
  • 22. 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
  • 23. 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)
  • 24. Objective-C: Propiedades  Podemos implementarlas nosotros: @property unsigned int age; - (unsigned int)age { return _age; } - (void)setAge:(unsigned int)age { _age = age; }
  • 25. 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; }
  • 26. 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 (.)
  • 27. 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
  • 28. 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.
  • 29. 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
  • 30. 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.
  • 31. 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
  • 32. 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).
  • 33. 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 */ }
  • 34. 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;
  • 35. 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!
  • 36. 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 
  • 37. 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
  • 38. 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.
  • 39. 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
  • 40. 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#
  • 41. 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;
  • 42. 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; }
  • 43. 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.
  • 44. 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
  • 45. 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
  • 46. 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.
  • 47. 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)
  • 48. 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)
  • 49. 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
  • 50. 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;
  • 51. Tema 3 Modelo de desarrollo de aplicaciones iOS
  • 52. 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
  • 53. 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
  • 54. 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
  • 55. iOS – Controles son vistas  Conceptualmente los controles iOS son vistas  Algunos tienen su propio controlador  Caso de controles “complejos”
  • 56. 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
  • 57. iOS – Aplicación single-view  Contiene:  Una vista (fichero .xib)  Un controlador  Un application delegate
  • 58. 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)
  • 59. 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
  • 60. 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
  • 61. 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!
  • 62. 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
  • 63. iOS – Control TableView  Necesita un delegado (UITableViewDelegate) y un DataSource (UITableViewDataSource)
  • 64. iOS – Control TableView  Lista de datos  Agrupaciones de datos  Siempre tiene 1 columna  Personalizable
  • 65. iOS – Control TableView  Necesita un delegado (UITableViewDelegate) y un DataSource (UITableViewDataSource)
  • 66. 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
  • 67. Eduard Tomàs @eiximenis etomas@pasiona.com eiximenis@techdencias.net Gracias!