79
PROGRAMACION Objective-C martes, 7 de abril de 15

Programación Objective C

Embed Size (px)

DESCRIPTION

diapositivas con tópicos básicos acerca de la programación de aplicaciones iOS basadas en objective-C.

Citation preview

PROGRAMACIONObjective-Cmartes, 7 de abril de 15OBJETOSPrincipios de 1980, Brad Cox y Tom Love deciden agregar los conceptos de orientacin de objetos al lenguaje C. Para los objetos, los construyeron sobre la idea de estructuras localizadas en el heap y se le agrega la sintaxis del envo de mensajes. El resultado fue el lenguaje Objective-C.Los objetos son muy parlanchines por naturaleza. Ellos envan y reciben mensajes acerca del trabajo que pueden desempear.Una clase describe a un tipo de objeto en particular. Esta descripcin incluye mtodos as como las variables de instancia donde los objetos almacenarn sus datos. El resultado de un objeto es una instancia de la clase.martes, 7 de abril de 15COCOA COMAND LINE TOOL#import int main (int argc, const char *argv[]){@autoreleasepool {NSDate *now = [NSDate date];NSLog(@The new date lives at %p, now);}return 0;}%p: Printed out the location of the objectmartes, 7 de abril de 15MENSAJESEl envo de mensajes es siempre encerrado entre corchetes y siempre tiene dos partes:Un apuntador al objeto que recibe el mensaje.El nombre del mtodo que ser disparado.El envi de un mensaje (como el llamado de una funcin), adems puede contener argumentos.martes, 7 de abril de 15MENSAJESmartes, 7 de abril de 15MENSAJES Mtodos de clase [NSDate date] Mtodos de instancia [now timeIntervalSince1970] Mtodo con un argumento, determinado por los dos puntos en el nombre del mtodo. [now dateByAddingTimeInterval:100000]martes, 7 de abril de 15MENSAJES Es una buena practica (y el nico camino aprobado por Apple) para el envo de mensajes en una lnea de cdigo (mensajes anidados): [[NSDate alloc] init] Multiples argumentos. NSCalendar *cal = [NSCalendar currentCalendar]; NSUInteger day = [cal ordinalityOfUnit:NSDayCalendarUnitinUnit:NSMonthCalendarUnitforDate:now]; Es la mejor manera de escribir un mtodo con multiples argumentos, de otra manera se vera muy largo. En este caso, el nombre del mtodo es ordinalityOfUnit:inUnit:forDate:martes, 7 de abril de 15NSSTRING Una instancia de NSString mantiene una cadena de caracteres. NSString *myString1 = @Why me!?; NSString *myString2 = [NSString stringWithFormat:@The best number is %d, 5]; NSUInteger charCount = [myString1 lenght]; Para vericar que dos cadenas son iguales: If([myString1 isEqual: myString2])martes, 7 de abril de 15NSARRAY NSMUTABLEARRAY Una instancia de NSArray es creada con una lista de apuntdores. No se pueden agregar o eliminar un apuntador de un arreglo. Una instancia de NSMutableArray es similar a un NSArray, pero se pueden agregar y eliminar apuntadores. (NSMutableArray hereda de NSArray:NSObject) NSDate*now = [NSDate date]; NSDate *tomorrow = [now dateByAddingTimeInterval:24.0 * 60.0 * 60.0]; NSDate *yesterday = [now dateByAddingTimeInterval:-24.0 * 60.0 * 60.0]; NSArray *dateList = [NSArray arrayWithObjects:now, tomorrow, yesterday, nil];martes, 7 de abril de 15NSARRAY NSMUTABLEARRAY LLVM new syntax in Mountain Lion Xcode NSArray *words = [NSArray arrayWithObjects:@list, @of , @words, nil]; NSArray *words = @[@list, @of , @words, @123, @3.14]; Algunos mtodos. count regresa el numero de tems en un arreglo. objectAtIndex regresa el apuntador que el arreglo tiene almacenado en algn ndice. Fast enumeration (forin) for (NSDate *d in dateList) { NSLog(@Here is a date: %@, d) }martes, 7 de abril de 15CLASES Recordar que una clase describe objetos de dos maneras: Mtodos (tanto mtodos de instancias como mtodos de clase) implementados por la clase. Variables de instancia con cada instancia de la clase. Una clase se dene es dos archivos: .h conocido como header o interface: El cual contiene la declaracin de variables de instancias y los mtodos. .m conocido como la implementacin: Aqu se escribe la denicin de cada mtodo.martes, 7 de abril de 15CLASES (.H)#import @interface Person : NSObject {oat heightInMeters;int weightInKilos;}- (oat)heightInMeters;- (void)setHeightInMeters:(oat);- (int)weightInKilos;- (void)setWeightInKilos:(int)w;- (oat)bodyMassIndex;@endmartes, 7 de abril de 15CLASES (.M)#import Person.h@implementation Person// Metodos de acceso- (oat)heightInMeters {return heightInMeters;}- (int)weightInKilos {return weightInKilos;}//- (void)setHeightInMeters:(oat)h {heightInMeters = h;}- (void)setWeightInKilos:(int)w {weightInKilos = w;}- (oat)bodyMassIndex {return weightInKilos / (heightInMeters * heightInMeters);}@endmartes, 7 de abril de 15CLASES (IMPLEMENTACIN)#import #import Person.hint main(int argc, const char *argv[]) {@autoreleasepool {Person *person = [[Person alloc] init];[person setWeightInKilos:96];[person setHeightInMeters:1.8];oat bmi = [person bodyMassIndex];NSLog(@person (%d %d) has a BMI of %f , [person weightInKilos], [person heightInMeters], bmi);}return 0;}martes, 7 de abril de 15DIAGRAMA DE OBJETOSmartes, 7 de abril de 15PROPIEDADESGran parte del cdigo de la clase es dedicado a los mtodos de acceso, Apple crea una forma rpida para declarar los mtodos setter y getter en una lnea llamada properties..h@property oat heightInMeters;@property int weightInKilos;.m@synthesize heightInMeters, weightInKilos;martes, 7 de abril de 15SELF Dentro de un mtodo, se tiene acceso a la variable local implcita self. self es un apuntador al objeto que est ejecutando el mtodo, esto es til cuando se quiere enviar mensajes a el mismo.oat h = [self heightInMeters];return [self weightInKilos] / (h * h); Adems se puede pasar a self como un argumento, dejando a otros objetos conocer donde est el objeto actual.- (void)addYourselfToArray:(NSMutableArray *)theArray {[theArray addObject:self];}martes, 7 de abril de 15HERENCIAmartes, 7 de abril de 15HERENCIAmartes, 7 de abril de 15SUSTITUCIN DE MTODOS (OVERRIDING METHODS)Cuando un mensaje es enviado, la bsqueda del mtodo de ese nombre comienza en la clase del objeto y va subiendo por la jerarqua de la herencia. La primer implementacin que es encontrada es la que se ejecuta. De esta manera, se pueden sustituir los mtodos heredados con una implementacin personalizada.martes, 7 de abril de 15SUPERPara ser precisos, la directiva super dice Ejecuta este mtodo, pero comienza buscando su implementacin en mi super clasemartes, 7 de abril de 15VARIABLE DE INSTANCIA DE OBJETOUna variable de instancia de objeto puede pertenecer a una de las siguientes categoras:Object-type attributes: Un apuntador a un objeto simple, por ejemplo un NSStringTo-one relationships: Un apuntador a un objeto complejo.To-many relationship: Un apuntador a una instancia de una clase de tipo coleccin.martes, 7 de abril de 15VARIABLES DE INSTANCIA DE OBJETOmartes, 7 de abril de 15OBJETO CON DIFERENTES ROLESmartes, 7 de abril de 15#IMPORT Y @CLASS#import: se realiza una copia idntica del archivo que lo manda llamar, hace al compilador ms lento.@class: Se le dice al compilador que no se preocupe cuando vea esa sentencia, es todo lo que necesita saber por el momento.martes, 7 de abril de 15COLECCIONESArreglos, conjuntos y diccionariosmartes, 7 de abril de 15ORDENAMIENTONSMutableArray tiene el siguiente mtodo.- (void)sortUsingDescriptors:(NSArray *)sortDescriptorsEl argumento es un objeto NSSortDescriptor. El descriptor de ordenamiento contiene el nombre de una propiedad de los objetos contenidos en el arreglo y la propiedad se puede ordenar de forma ascendente o descendente.martes, 7 de abril de 15NSSORTDESCRIPTORmartes, 7 de abril de 15NSSORTDESCRIPTORNSSortDescriptor *voa = [NSSortDescriptor sortDescriptorWithKey:@valueOfAssets ascending:YES];NSSortDescriptor *ei = [NSSortDescriptor sortDescriptorWithKey:@employeeID ascending:YES];[employees sortUsingDescriptors:[NSArray arrayWithObjects:voa, ei, nil]];martes, 7 de abril de 15FILTRADO Existe una clase llamada NSPredicate, un predicado contiene una sentencia que se podra cumplir. Un NSMutableArray tiene un mtodo prctico para descartar todos los objetos que no satisfacen el predicado:- (void)lterUsingPredicate:(NSPredicate *)predicate; Un NSArray tiene un mtodo para crear un nuevo arreglo conteniendo todos los objetos que satisfacen el predicado:- (NSArray)lteredArrayUsingPredicate:(NSPredicate *)predicate; NSPredicate *predicate = [NSPredicate predicateWithFormat:@holder.valueOfAsets > 70]; NSArray *toBeReclaimed = [allAssets lteredArrayUsingPredicate:predicate]; Apples Predicate Programming Guidemartes, 7 de abril de 15NSSET/NSMUTABLESET Un conjunto es una coleccin que no puede ser ordenada, adems un objeto en particular puede aparecer solamente una vez. Los conjuntos son principalmente usados para vericar la existencia de algn objeto. Los conjuntos son increblemente rpidos. Un NSSet es inmutable, no se pueden agregar o eliminar objetos despus de que el conjunto ya ha sido creado. NSMutableSet es la subclase que tiene la habilidad de agregar o eliminar objetos. No se puede obtener un objeto por ndice, debido a que una coleccin no puede ser ordenada. En lugar de eso, se tiene un mtodo para preguntar sobre la existencia de objetos.- (BOOL)containsObject(id)x;martes, 7 de abril de 15NSDICTIONARY/NSMUTABLEDICTIONARYUn diccionario es una coleccin de parejas llave-valor. La llave es generalmente una cadena, y el valor puede ser cualquier tipo de objeto. Como los arreglos y los conjuntos, un diccionario puede ser mutable o no mutable.NSMutableDictionary *executives = [[NSMutableDictionary alloc] init];[executives setObject:person forKey:@CEO];martes, 7 de abril de 15LLVM NEW SYNTAX IN MOUNTAIN LION XCODENSDictionary *d = {@key: @Value,@name: @Joris,@n: @1234, @3: @string};martes, 7 de abril de 15NSNUMBERSNSNumber *n1 = @1000;NSNumber *n2 = @3.1415926;NSNumber *c = @'c';NSNumber *b = @YES;NSNumber *f = @2.5f;NSNumber *nu = @256u;martes, 7 de abril de 15CONSTANTESPara el caso de las constantes, existen dos maneras de denirlas en Objective-C#dene: Le dice al preprocesador Siempre que encuentres A, remplzalo con B#dene M_PI 3.14159265358979323846264338327950288function-like: Macro#dene MAX(A, B) ((A) > (B) ? (10) : (12))martes, 7 de abril de 15VARIABLES GLOBALESNSLocale.hextern NSString const *NSLocaleCurrencyCode;NSLocale.mNSString const *NSLocaleCurrencyCode = @currency;UsoNSLocale *here = [NSLocale currentLocale];NSString *currency = [here objectForKey:NSLocaleCurrencyCode];martes, 7 de abril de 15ENUMenum BlenderSpeed {BlenderSpeedStir = 1,BlenderSpeedChop = 2,BlenderSpeedLiquify = 5,BlenderSpeedPulse = 9,BlenderSpeedIceCrush = 15,};@interface Blender : NSObject {enum BlenderSpeed speed;}- (void)setSpeed:(BlenderSpeed)x;@endmartes, 7 de abril de 15PARA ESCRIBIR MENOStypedef enum {BlenderSpeedStir = 1,BlenderSpeedChop = 2,BlenderSpeedLiquify = 5,BlenderSpeedPulse = 9,BlenderSpeedIceCrush = 15,} BlenderSpeed;@interface Blender : NSObject {BlenderSpeed speed;}- (void)setSpeed:(BlenderSpeed)x;@endmartes, 7 de abril de 15ASIGNACIN AUTOMTICAtypedef enum {BlenderSpeedStir,BlenderSpeedChop,BlenderSpeedLiquify,BlenderSpeedPulse,BlenderSpeedIceCrush,} BlenderSpeed; #dene o variables globales?martes, 7 de abril de 15ESCRITURA Y LECTURA DE ARCHIVOS CON NSSTRING Y NSDATAmartes, 7 de abril de 15ESCRITURA DE ARCHIVO CON NSSTRINGNSMutableString *str = [[NsMutableString alloc] init];NSError *error = nil;Something to str[str writeToFile:@/tmp/cool.txt atomically:YESencoding:NSUTF8StringEncoding error:&error];martes, 7 de abril de 15LEER ARCHIVOS CON NSSTRINGNSString *str = [NSString alloc] initWithContentsOfFile:@/etc/resolv.conf encoding:NSASCIIStringEncoding error:&error];martes, 7 de abril de 15ESCRIBIR UN NSDATA A UN ARCHIVOBOOL written = [data writeToFile:@/tmp/google.pngoptions:0 error:&error];martes, 7 de abril de 15LEER UN ARCHIVO CON NSDATANSData *readData = [NSData dataWithContentsOfFile:@/tmp/google.png];martes, 7 de abril de 15CALLBACKS En una aplicacin, se necesita tener un objeto que este a la escucha de eventos, como movimientos del ratn, eventos de touch, timers y actividad en la red, etc. Para Mac OS y iOS, esto es capturado por una instancia de NSRunLoop. El bucle de ejecucin (run loop), se sienta y espera a que ocurra algo, en ese momento se lanza un mensaje a otro objeto. Hollywood principle: Dont call us, well call you Cuando algo ocurre, el bucle de ejecucin ejecuta una callback. Debido a que esto es una idea general, se toma a x como un algo especco que ocurre. En Objective-C existen tres tipos de callbaks:martes, 7 de abril de 15CALLBACKS Target-Action: Antes de comenzar la espera, se dice Cuando x ocurre, enva este mensaje en particular a ese objeto en particular Helper objects: Antes de comenzar la espera, se dice Aqu est este objeto de ayuda que est de acuerdo a su protocolo. Envale mensajes cuando las cosas ocurran. Los helper objects a menudo son conocidos como delegates o data source. Notications: Existe un objeto llamado Notication Center. Antes de comenzar la espera, se le dice al Notication Center Este objeto est esperando este tipo de noticaciones. Cuando uno llega, se enviar este mensaje. Cuando x ocurra, el objeto estndar publica una noticacin al Notication Center, y el centro la reenva a su objeto.martes, 7 de abril de 15PROTOCOLOSLa clase de un objeto es diferente de su rol en un sistema de trabajo. Realmente las clases con mas generales que el rol que ellas pueden jugar en cualquier aplicacin en particular. As, las instancias de una clases pueden ser usadas en muchos caminos diferentes. Se ha hablado de cmo especicar una clase, es posible especicar un rol? Hasta cierto grado, se puede especicar un rol usando el constructor @protocol.Un protocolo es un listado de declaracin de mtodos o dene un contrato de mensajes, algunos mtodos son obligatorios y otros opcionales. Si el objeto debe cumplir un rol, debe implementar los mtodos obligatorios y debe escoger que mtodos opcionales va a implementar.martes, 7 de abril de 15SINTAXIS PROTOCOLO@protocol ProtocoName @optional// list of methods and properties@required// list of methods and properties@endmartes, 7 de abril de 15SUSCRIPCIN A UN PROTOCOLO@inteface MyClass : NSObject @endmartes, 7 de abril de 15PROPERTY LISTUn propety list es una combinacin de cualquier de las siguientes cosas:NAArrayNSDictionaryNSStringNSDataNSDateNSNumbermartes, 7 de abril de 15PROPERTY LIST#import int main(int argc, const char * argv[]) { @autoreleasepool { NSMutableArray *stocks = [[NSMutableArray alloc] init]; NSMutableDictionary *stock; stock = [NSMutableDictionary dictionary]; [stock setObject:@AAPL forKey:@symbol]; [stock setObject:[NSNumber numberWithInt:200] forKey:@shares]; [stocks addObject:stock]; stock = [NSMutableDictionary dictionary]; [stock setObject:@GOOG forKey:@symbol]; [stock setObject:[NSNumber numberWithInt:160] forKey:@shares]; [stocks addObject:stock]; [stocks writeToFile:@/tmp/stocks.plist atomically:YES]; } return 0;}martes, 7 de abril de 15PROPERTY LISTmartes, 7 de abril de 15PROPERTY LIST

shares 200 symbol AAPL

shares 160 symbol GOOG

martes, 7 de abril de 15ESCRIBIENDO MTODOS INIT En la clase NSObject existe un mtodo init. Despus de asignar espacio para un objeto, se enva el mensaje init a la nueva instancia para poder inicializar sus variables de instancia con los valores utilizables.- (id)init { self =[super init];if (self) { [self setVoltage:120]; } return self}martes, 7 de abril de 15MTODO INIT CON ARGUMENTOS-(id)initWithProductName:(NSString *)pn {self = [super init];if(self) { [self setProductName:pn]; [self setVoltage:120]}return self;}- (id)init {return [self initWithProductName:@Unknown];}martes, 7 de abril de 15INICIALIZADOR DESIGNADOAl redenir el init, con la llamada de initWithProductName:, el mtodo se convierte en el inicializador designado, es importante documentarlo en el cdigo.//The designated initializer- (id)initWithProductName:(NSString *)pnmartes, 7 de abril de 15REGLAS PARA INIT Reglas que todo programador Objective-C con estilo debe seguir cuando se escribe un inicializado: Si una clase tiene muchos inicializadores, slo uno debe hacer el trabajo real. Ese mtodo es conocido como el inicializador designado. Todos los dems inicializadores deben llamar, ya sea directa o indirectamente el inicializador designado El inicializador designado deber llamar al inicializador designado de su superclase antes de inicializar sus variables de instancia. Si el inicializador designado de tu clase tiene un nombre diferente que el inicializador designado de su superclase, debes redenir el inicializador designado de la superclase para que llame al nuevo inicializador designado. Si se tienen muchos inicializadores, es importante documentar de manera clara cual es el inicializador designado en la interfaz.martes, 7 de abril de 15CATEGORASLas categoras permiten al programador agregar mtodos a cualquier clase existente. 1.Crear:An objective-C category, 2.Nombre para una categora:ClassName+CategoryName.*martes, 7 de abril de 15CREAR UNA CATEGORAmartes, 7 de abril de 15CATEGORAmartes, 7 de abril de 15INTRODUCCIN A BLOQUESLos callbacks (delegados y noticaciones) permiten a otros objetos llamar mtodos en tu objeto en respuesta a eventos. Generalmente esto ocasiona que tu cdigo se separe.En Mac OS X 10.6 y iOS4 se introduce una nueva caracterstica llamada bloques. Un bloque de Objective-C es slo un pedazo de cdigo como una funcin de C, pero este puede ser enviado como dato.martes, 7 de abril de 15DECLARACIN DE UN BLOQUEmartes, 7 de abril de 15EJEMPLO BLOQUEint main(int argc, cons char * argv[]) { @autoreleasepool {NSArray *oldStrings = [NSArray arrayWithObjects:@Sauerkraut, @Raygun, @Big Nerd Ranch, @Mississippi, nil];NSMutableArray *newStrings = [NSMutableArray array];NSArray *vowels = [NSArray arrayWithObjects: @a, @e, @i, @o, @u, nil];// Declaracin de la variable de bloqlevoid (^devowelizer)(id string, NSUInteger i, BOOL *stop);// Asignacin de un bloque a una variabledevowelizer = ^(id string, NSUInteger i, BOOL *stop) {NSMutableString *newString = [NSMutableString stringWithString:string];for(NSString *s in vowels) {NSRange fullRange = NSMakeRange(0, [newString lenght]);[newString replaceOccurrencesOfString:s withString:@ options:NSCaseInsensitiveSearch

range:fullRange];}[newStrings addObject:newString];}; // Fin de la asignacin del bloque[oldStrings enumerateObjectsUsingBlock:devowelizer]; } return 0;}martes, 7 de abril de 15DECLARACIN Y ASIGNACIN DE UN BLOQUEvoid (^devowelizer)(id string, NSUInteger i, BOOL *stop) = ^(id string, NSUInteger i, BOOL *stop) {NSMutableString *newString = [NSMutableString stringWithString:string];for(NSString *s in vowels) {NSRange fullRange = NSMakeRange(0, [newString lenght]);[newString replaceOccurrencesOfString:s

withString:@

options:NSCaseInsensitiveSearch

range:fullRange];}[newStrings addObject:newString];}; // Fin de la asignacin del bloquemartes, 7 de abril de 15TYPEDEFtypedef void (^ArrayEnumerationBlock)(id, NSUInteger, BOOL);ArrayEnumerationBlock devowelizer;martes, 7 de abril de 15RETORNO DE VALORESdouble (^divBlock)(double,double) = ^(double k, double j) { return k/j;};double quotient = divBlock(42.0, 12.5);martes, 7 de abril de 15PATRONES DE DISEO DE SOFTWAREmartes, 7 de abril de 15PATRONES DE DISEOEn la ingeniera de software un patrn de diseo, es una solucin reutilizable general a un problema que ocurre comnmente en el diseo de software, es una descripcin o plantilla del como resolver un problema que puede ser usado en diferentes situaciones. Los patrones son formalizados como las mejores practicas que el programador puede implementar en la aplicacin.El diseo de patrones orientado a objetos, generalmente muestra la relacin e interacciones entre las clases y los objetos, sin especicar las clases u objetos nales que corresponden a la aplicacin. Tambin nos puede ayudar a la creacin de cdigo poco acoplado, de manera que se pueda cambiar o reemplazar componentes en el cdigo, de manera rpida.martes, 7 de abril de 15PATRONES DE DISEO Los patrones de diseo se encuentran agrupados en categoras: patrones de creacin, patrones estructurales y patrones de comportamiento. Los patrones de diseo ms comunes en Cocoa Touch son: Creacionales: Singleton y Abstract Factory Estructurales: MVC, Decorator, Adapter, Facade y Composite De comportamiento: Observer, Memento, Chain of Responsability y Commandmartes, 7 de abril de 15MODEL-VIEW-CONTROLLERModelo: Es el objeto que contiene los datos de la aplicacin, as como tambin dene como manipularlos.Vista: Corresponde al objeto encargado de la presentacin visual del Modelo y los controles con los que el usuario puede interactuar (UIView).Controlador: El controlador es el encargado de coordinar el trabajo, accede a los datos del modelo y los muestra en la vista (ViewController).martes, 7 de abril de 15DIAGRAMA MVCmartes, 7 de abril de 15PRIMERA APLICACIN IOSClass prex: Tres letras, Apple dos NS, UI, etc.App delegate: Punto de inicio de la aplicacin, cada aplicacin tiene el suyo. Es el responsable de procesar los eventos y coordinar el trabajo de otros objetos en la aplicacin.UIKit: Framework que contiene las deniciones de clases para iOSFoundation: Supporting Files -> -Prex.pchmartes, 7 de abril de 15DELEGADO DE LA APLICACIN UIApplication: Controla el estado de la aplicacin y acta como enlace al sistema operativo. Se crea automticamente un delegado para la instancia de UIApplication, de aqu el nombre de app delegate. El delegado tiene la responsabilidad de recibir los mensajes sobre el estado de la instancia de UIApplication. application:didFinishLaunchingWithOptions: Es el mtodo ms importante del delegado, indica que la aplicacin est a punto de presentarse al usuario.martes, 7 de abril de 15MVC EN IOSmartes, 7 de abril de 15LA APLICACINmartes, 7 de abril de 15DIAGRAMA DE OBJETOS DE LA APPmartes, 7 de abril de 15MVC DE LA APLICACINmartes, 7 de abril de 15SINGLETONAsegura que slo exista una instancia para una clase dada y que hay un punto de acceso global para esa instancia.martes, 7 de abril de 15DIAGRAMA SINGLETONmartes, 7 de abril de 15