Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2011-2012 Depto. Ciencia de la Computación e IA
Plataforma iOS
Sesión 1: Xcode y Objective-C
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Puntos a tratar• Entorno Xcode• Tipos de datos• Paso de mensajes• Manejo de cadenas• Localización• Clases y objetos• Gestión de la memoria• Clases útiles
2
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Desarrollo para iOS
• Debe realizarse desde el entorno Xcode• Sólo disponible en Mac
• Se programa en Objective-C• Podemos incluir también código C, C++, u Objective-C++
• Algunas herramientas generan aplicaciones iOS• Unreal Development Kit• Adobe Flash CS5.5
3
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Entorno Xcode
• Nos centraremos en la versión 4.x de este entorno• Existen grandes diferencias respecto a la versión 3.x
• Debemos descargar Xcode + iOS SDK• Se descarga desde la Mac App Store (a partir de Lion)• Versión de Snow Leopard disponible sólo para suscriptores
• Para cada nueva versión de iOS debemos descargar el SDK• Versión 4.2 soporta iOS 4.0 a 5.0.1• Si conectamos dispositivo con iOS previo descarga el SDK
4
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Nuevo proyecto• File > New > New Project ...
5
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Datos del proyecto
6
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Identificador del paquete• Cada aplicación se identifica por su bundle identifier
es.ua.jtech.EspecialistaMoviles
• Se compone de• Company identifier
Se suele utilizar nuestra URL al revés: es.ua.jtech• Product name
Nombre de nuestra aplicación: EspecialistaMoviles
• En Objective-C no hay paquetes• Como espacio de nombres se utiliza un prefijo• Prefijo común para las clases de una aplicación / librería: UA
7
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Ventana de Xcode
8
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Elementos de la ventana de Xcode
• Navegador (parte izquierda)• Elementos del proyecto, búsqueda, lista de errores de compilación
• Editor (parte central)• Edición del código fuente, interfaz y fichero de configuración.
• Barra de botones (parte superior)• Ejecución de la aplicación (izquierda)• Mostrar/ocultar elementos de la interfaz (derecha)
• Utilidades (parte derecha)• Ayuda rápida y propiedades de los elementos seleccionados
• Depuración (parte inferior)• Consola de logs
9
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Elementos del proyecto• Fuentes• Fuente Objective-C (.m)• Fichero de cabecera (.h)• Objetos de la interfaz (.xib)
• Recursos y configuración• Ficheros de propiedades (.plist)• Ficheros de cadenas (.strings)
• Frameworks• Librerías utilizadas por el proyecto
• Productos• Resultado de construir la aplicación
10
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Proyecto y targets
• Un proyecto puede contener varios targets
• Un target especifica cómo construir la aplicación• Versión iPhone• Versión iPad• Pruebas de unidad
• Se puede introducir configuración general para el proyecto, o particular para un target determinado
11
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Configuración general del target
12
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Fichero Info.plist• Configuración de la aplicación• Nombre a mostrar, identificador, icono, dispositivos soportados, ...
13
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Configuración de la construcción
14
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Fases de la construcción• Indica para un target qué recursos se deben compilar, cuáles se
deben incluir en el paquete, y qué librerías se deben referenciar
15
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Configuraciones del proyecto• Nos permiten especificar diferentes conjuntos de parámetros de
construcción. • Por defecto se crean Debug y Release
16
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Esquemas
• Vinculan targets a configuraciones para cada posible acción
• Acciones:• Build: Sólo construye la aplicación• Run: Construye y ejecuta la aplicación (Debug)• Test: Ejecuta las pruebas de unidad (Debug)• Profile: Análisis dinámico de la aplicación (Release)• Analyze: Análisis estático del código (Debug)• Archive: Genera el producto (Release)
17
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Configuración de esquemas• Podemos cambiar el target y la configuración asociados a cada
acción en el esquema actual, o crear nuevos esquemas
18
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Ejecución de la aplicación
• Podemos ejecutar la aplicación mediante la acción Run
• Se puede ejecutar en• Simulador• Dispositivo real
• Para ejecutar en dispositivo real necesitamos certificado de desarrollador
19
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Añadir recursos• Add Files To ...• Añade recursos que
se empaquetarán con la aplicación
20
Copia los recursos al directorio del proyecto (si no están ya ahí)
Permite convertir la estructura de directorios añadida a grupos o carpetas
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Grupos y carpetas• Los grupos sólo se muestran en el entorno• Aparecen como carpetas amarillas• No se corresponde con la estructura del disco• Se empaquetan todos en el raíz del bundle
• Las carpetas se empaquetan como tales en el bundle• Aparecen como carpetas azules
21
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Obtención de ayuda• Utilidades• Ayuda rápida• Elemento bajo
el cursor
• Organizer• Documentación
• Atajo• Alt+click sobre
el código• Abre cuadro de
ayuda
22
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Objective-C• Extensión del lenguaje C orientada a objetos• Ficheros con extensión .m en lugar de .c• Utilizaremos la API Cocoa Touch
• Diferente a C++• Se basa en paso de mensajes en lugar de llamadas a métodos
• Podemos utilizar cualquier elemento de C estándar
• Existe la variante Objective-C++• Permite utilizar código C++ dentro de Objective-C• Ficheros con extensión .mm
23
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Paso de mensajes• En Objective-C se habla de paso de mensajes• Similar a lenguajes como Smalltalk• La dirección a llamar se resuelve en tiempo de ejecución
• Obtener longitud de una cadena
• El método puede no existir en el objeto receptor del mensaje
24
NSString* cadena = @"cadena-‐de-‐prueba";int tam = [cadena length];
NSString* cadena = @"cadena-‐de-‐prueba";[cadena metodoInexistente]; // Produce warning, pero compila
id cadena = @"cadena-‐de-‐prueba";[cadena metodoInexistente]; // Solo da error de ejecucion
Puntero genérico a objeto
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Cadenas• Las cadenas en Objective-C son objetos de clase NSString• No confundir con las cadenas de C (char *)• Los literales de NSString se crean con el prefijo @
• Crear una cadena con formato
• Impresión de logs
• Aparecen en la consola de depuración
25
NSString *nombre = @"Pepe";int edad = 20; NSString *cadena = [NSString stringWithFormat: @"Nombre: %@ (edad %d)", nombre, edad];
NSString *cadena = @"Cadena";
NSLog(@"i = %d, obj = %@", i, obj);
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Localización• Podemos añadir localización de recursos• Para todo el proyecto• Para recursos individuales (panel de utilidades)
• Se crean varias copias del recurso, una para cada idioma• En disco cada fichero está en un directorio
en.lproj, es.lproj. ca.lproj, ...
• Localización de cadenas de configuración
26
// Versión en castellano del fichero InfoPlist.strings"CFBundleDisplayName" = "MovilesUA";
// Versión en inglés del fichero InfoPlist.strings "CFBundleDisplayName" = "MobileUA";
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Localización de cadenas• Por defecto se extraen a un fichero Localizable.strings• Creamos el fichero con New File > iOS > Resource > Strings File
• Formato del fichero
• Acceso a la cadena localizada desde el código
27
"identificador" = "cadena a mostrar";
"Titulo" = "Moviles UA";
NSString *cadenaLocalizada = NSLocalizedString(@"Titulo", @"Mobile UA");
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Tipos de datos básicos• Contamos con todos los tipos básicos de C• char, short, int, long, float, double, ...
• Cocoa Touch define tipos básicos adicionales• Se adaptan a la arquitectura (32 ó 64 bits)
NSInteger (entero con signo)NSUInteger (entero sin signo)CGFloat (flotante)
• Tipo booleano• Puede tomar como valor las constantes YES o NO
BOOL b = YES;
28
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Enumeraciones
• Se definen igual que en C• Cada elemento tiene asignado un valor entero (incremental)
• Podemos asignar manualmente los valores
29
typedef enum { UATipoAsignaturaOptativa, UATipoAsignaturaObligatoria, UATipoAsignaturaTroncal} UATipoAsignatura;
typedef enum { UATipoAsignaturaOptativa = 0, UATipoAsignaturaObligatoria = 1, UATipoAsignaturaTroncal = 2} UATipoAsignatura;
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Estructuras de datos
• También se definen igual que en C
• En Cocoa Touch hay funciones para inicializar y gestionar las estructuras que define
30
struct CGPoint { CGFloat x; CGFloat y;};typedef struct CGPoint CGPoint;
CGPoint punto = CGPointMake(x,y);
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Directivas• #import• Importa fichero de cabecera .h• A diferencia de #include, evita inclusiones cíclicas
• #define• Define macros de preprocesamiento• Se pueden comprobar los símbolos definidos
• #pragma mark• Permite etiquetar segmentos de código
31
#ifdef DEBUG NSLog(@"Texto del log");#endif
#pragma mark Constructores// Código de los constructores #pragma mark Eventos del ciclo de vida// Código de los manejadores de eventos
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Constantes
• Se definen mediante el modificados const• Afecta al elemento justo a su izquierda
• Es preferible definir las constantes con const en lugar de #define
32
// Puntero variable a objeto NSString constante (MAL)const NSString * UATitulo = @"Menu"; // Equivalente al anterior (MAL)NSString const * UATitulo = @"Menu"; // Puntero constante a objeto NSString (BIEN)NSString * const UATitulo = @"Menu";
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Definición de una clase (.h)
33
@interface UAAsignatura : NSObject { NSString *_nombre; NSString *_descripcion; NSUInteger _horas;} + (CGFloat)creditosParaHoras:(CGFloat)horas;-‐ (CGFloat)creditos;-‐ (CGFloat)tasaConPrecioPorCredito:(CGFloat)precioCredito esBecario:(BOOL)becario; @end
Variables de instancia (protegidas)
Métodos de clase
Métodos de instancia
Nombre de la clase
Hereda de NSObject
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Implementación de la clase (.m)
34
#import "UAAsignatura.h" const CGFloat UAHorasPorCredito = 10;const CGFloat UADescuentoBecario = 0.5; @implementation UAAsignatura + (CGFloat) creditosParaHoras:(CGFloat)horas { return horas / UAHorasPorCredito;} -‐ (CGFloat)creditos { return [UAAsignatura creditosParaHoras: _horas];} -‐ (CGFloat)tasaConPrecioPorCredito:(CGFloat)precioCredito esBecario:(BOOL)becario { CGFloat precio = [self creditos] * precioCredito; if(becario) { precio = precio * UADescuentoBecario; } return precio;} @end
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Vista de asistente
35
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Creación e inicialización• Reservamos memoria para un objeto con alloc• Inicializamos el objeto con un inicializador init
• Inicialización mediante métodos factoría• Son métodos de clase• No hace falta que reservemos memoria nosotros• Su nombre comienza por el del objeto que van a crear
36
NSString *cadVacia = [[NSString alloc] init];NSString *cadFormato = [[NSString alloc] initWithFormat: @"Numero %d", 5];
NSString *cadVacia = [NSString string];NSString *cadFormato = [NSString stringWithFormat: @"Numero %d", 5];
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Implementación de inicializadores
37
-‐ (id)initWithNombre:(NSString*)nombre descripcion:(NSString*)descripcion horas:(NSUInteger)horas { self = [super init]; if(self != nil) { _nombre = nombre; _descripcion = descripcion; _horas = horas; } return self;}
Devuelven siempre el tipo id
Inicializa la superclase y asigna el objeto resultante al objeto actual (self)
Si la superclase no ha devuelto un puntero a nulo, inicializa variables de instancia propias
Devuelve el objeto inicializado (self)
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Inicializador designado• Debe ser invocado por el resto de inicializadores• Suele ser el que lleva un mayor número de parámetros
38
-‐ (id)init;-‐ (id)initWithNombre:(NSString*)nombre;-‐ (id)initWithNombre:(NSString*)nombre descripcion:(NSString*)descripcion horas:(NSUInteger)horas;
-‐ (id)init{ return [self initWithNombre: @"Sin nombre"];} -‐ (id)initWithNombre:(NSString *)nombre{ return [self initWithNombre:nombre descripcion:@"Sin descripcion" horas:-‐1];}
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Gestión de la memoria
• La gestión se hace contando referencias• Cuando se reserva con alloc el número de referencias es 1• Podemos incrementar el número de referencias con retain• Podemos decrementarlo con release• Cuando las referencias llegan a 0, se libera la memoria
• Regla de oro• El objeto que retiene (alloc-retain), debe liberar (release)
39
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Retención y liberación• En el constructor retenemos variables de instancia
• Al liberarse un objeto, se ejecuta su método dealloc• Liberar variables retenidas por el objeto• Llamar a dealloc en la superclase
40
-‐ (id)initWithNombre:(NSString*)nombre descripcion:(NSString*)descripcion horas:(NSUInteger)horas { self = [super init]; if(self != nil) { _nombre = [nombre retain]; _descripcion = [descripcion retain]; _horas = horas; } return self;}
-‐ (void)dealloc { [_nombre release]; [_descripcion release]; [super dealloc];}
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Gestión en métodos factoría• El propio método debe liberar lo que ha retenido• El objeto debe estar disponible en memoria al menos hasta que lo
recoja quien llamó al método
• Utilizamos autorelease• Guarda la liberación como pendiente en un autorelease pool, que
se llevará a cabo cuando termine la pila de llamadas
41
+ (id)asignaturaWithNombre:(NSString*)nombre descripcion:(NSString*)descripcion horas:(NSUInteger)horas { return [[[UAAsignatura alloc] initWithNombre:nombre descripcion:descripcion horas:horas] autorelease];}
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Clase NSObject• Casi todos los objetos heredan de ella en última instancia• Podemos no heredar de nadie para crear una estructura de datos
• Podemos sobrescribir una serie de métodos• isEqual
Comprueba si dos objetos son iguales internamenteDevuelve YES o NO
• descriptionDevuelve la descripción del objeto en forma de cadenaEs lo que se obtiene al imprimir el objeto con %@
• hashCódigo hash para indexar el objetoDebe ser coherente con isEqual
42
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Copia de objetos• Algunos objetos pueden copiarse con el método copy• Al crear un objeto como copia su contador de referencias es 1
• Objetos mutables e inmutables• Algunos objetos existen en las dos modalidades
NSString y NSMutableString
• Podemos obtener copias mutables de objetos inmutables con mutableCopy
43
NSString *cadena = @"Mi cadena"; NSString *copiaInmutable = [cadena copy]; NSMutableString *copiaMutable = [cadena mutableCopy];
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Gestión de fechas• Se gestionan mediante la clase NSDate
• Podemos obtener los componentes de una fecha
• O una fecha a partir de sus componentes
44
NSDate *fecha = [NSDate date];
NSCalendar *calendario = [NSCalendar currentCalendar];NSDateComponents *componentes = [currentCalendar components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:fecha]; NSInteger dia = [componentes day];NSInteger mes = [componentes month];NSInteger anyo = [componentes year];
NSDateComponents *componentes = [[NSDateComponents alloc] init];[componentes setDay: dia];[componentes setMonth: mes];[componentes setYear: anyo]; NSDate *fecha = [calendario dateFromComponents: componentes];[componentes release];
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Tratamiento de errores• Se pueden utilizar excepciones
• Son siempre unchecked• Para errores de tipo checked suele utilizarse NSError
45
NSError *error;NSString *contenido = [NSString stringWithContentsOfFile: @"texto.txt" encoding: NSASCIIStringEncoding error: &error];NSString *motivo = [error localizedFailureReason];
@try // Codigo @catch(NSException *ex) { // Codigo tratamiento excepcion}@finally { // Codigo de finalización}
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Ámbito de las variables• Global• Se declaran fuera de cualquier método. Para que se pueda
acceder desde otros ficheros deben aparecer declaradas con extern en algún fichero de cabecera.
• Fichero• Se declaran fuera de cualquier método con modificador static.
Accesible sólo desde el fichero en el que se define.
• Local• Se declaran dentro de un método. Si lleva modificador static
sólo se instancia la primera vez que se ejecuta el método.
46
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
Patrón singleton
• Podemos utilizar variables de tipo static para implementar el patrón singleton
• Normalmente crearemos un método de clase con prefijo shared que nos dará acceso a la instacia única
47
+ (UADatosCompartidos) sharedDatosCompartidos { static DatosCompartidos *datos = nil; if(nil == datos) { datos = [[DatosCompartidos alloc] init]; } return datos;}
Especialista Universitario en Desarrollo de Aplicaciones para Dispositivos Móviles
Plataforma iOS © 2011-2012 Depto. Ciencia de la Computación e IA Xcode y Objective-C
¿Preguntas...?
48