domingo, 31 de marzo de 2013

iOS: Introducción a Objetive-C

Antes de comenzar a desarrollar para iOS, necesitamos tener unas nociones básicas, y que mejor forma que empezar con una breve introducción a Objetive-C, el lenguaje de programación en el que se basa la herramienta XCODE con la que desarrollaremos.


Objective-C consiste en una capa muy fina situada por encima de C y que compone un supe conjunto de C. Esto nos permite compilar cualquier programa escrito en C con un compilador de Objective-C.

La sintaxis de objetos de Objective-C deriva de Smalltalk1, de forma que todas las operaciones no orientadas a objetos (incluyendo variables, pre-procesamiento, expresiones, declaración de funciones y llamadas a funciones) son idénticas a las de C, mientras que la sintaxis para las características orientadas a objetos es una implementación similar a la mensajería de Smalltalk.

Este modelo de programación orientada a objetos se basa en enviar mensajes a instancias de objetos, donde el receptor tiene la tarea de interpretar por sí mismo el mensaje. Una consecuencia de esto es que el mensaje del sistema no tiene chequeo de tipo, por lo que el receptor no garantiza la respuesta a un mensaje. Cuando un mensaje no es esperado por el receptor simplemente lo ignora y devuelve un puntero nulo. Definimos estos mensajes como métodos .

Interfaces, implementaciones

Objective-C requiere que la interfaz e implementación de una clase estén en bloques de código separados.

La interfaz de la clase está definida en el archivo cabecera: MyClass.h mientras que los archivos de implementación (métodos) normalmente poseen la extensión .m: MyClass.m

#import <Foundation/Foundation.h>
@interface MyImageController : NSObject
-(UIImage *)imageForInOutSmall:(BOOL)inmsg;
@end
Ejemplo de cabecera Objetive-C

#import "MyImageController.h"
@implementation MyImageController
- (UIImage *)imageForInOutSmall:(BOOL)inmsg
{
    if (inmsg)
        return [UIImage imageNamed:@"inmsg"];
    else
        return [UIImage imageNamed:@"outmsg"];
}
@end
Ejemplo de implantación de clase Objetive-C

Métodos

Existen dos signos para definir los métodos: los signos más (+) nos indican aquellos métodos de clase, los cuales no tienen acceso a las variables de la instancia, mientras que los signos menos (-) hacen referencia a los métodos de instancia.

#import <Foundation/Foundation.h>
@interface SampleClass : NSObject
+(NSString *)classMethod:(NSString *)input;
-(NSString *)instanceMethod:(NSString *)input;
@property (nonatomic,strong) NSString *myProperty;
@end
Cabecera de clase con método de clase y de instancia

#import "SampleClass.h"
@implementation SampleClass
@synthesize myProperty;
+(NSString *)classMethod:(NSString *)input{
    return @"aquí no se puede usar la propiedad";
}
-(NSString *)instanceMethod:(NSString *)input{
    return [NSString stringWithFormat:@"aquí si se puede usar
    la propiedad y vale %@", myProperty];
}@end
Implementación de clase con método de clase e instancia

Los tipos de retorno de estos mensajes (métodos) pueden ser de cualquier tipo del estándar de C, un puntero a un objeto genérico de Objective-C, o un puntero a un tipo específico así como NSArray *, NSImage *, o NSString *. El tipo de retorno por defecto es el tipo genérico id de Objective-C, que no es más que un puntero a objeto.

Los argumentos de los métodos comienzan con dos puntos seguidos por el tipo de argumento esperado en los paréntesis seguido por el nombre del argumento. En algunos casos (por ej. cuando se escriben APIs de sistema) es útil agregar un texto descriptivo antes de cada parámetro.

-(NSString *)metodoConVariosArgs:(NSString *)arg0 arg1:(NSString *)arg1 arg3:(NSString *)arg3 arg4:(NSString *)arg4
{
    (...)
}
Método con varios argumentos

Instanciación de Objetos

Una vez que una clase es escrita en Objective-C, puede ser instanciada. Esto se lleva a cabo primeramente alojando la memoria para el nuevo objeto y luego inicializándolo. Un objeto no es completamente funcional hasta que ambos pasos sean completados. Esos pasos típicamente se logran con una simple línea de código:

SampleClass *sample = [[SampleClass alloc] init];
Instanciación de objetos

Protocolos

Objective-C fue extendido por NeXT para introducir el concepto de herencia múltiple a través de la introducción de protocolos.
Un protocolo no es más que una definición de métodos que la clase que los implemente debe cumplir. Un detalle importante es que estos métodos no son requeridos de especificar en la cabecera de la clase que los implementa.