Introducción Objective-C, Programación Orientada a Objectos

Xcode

Objective-C es el lenguaje usado para el desarrollo en OS X y iOS, es un súper conjunto del lenguaje de programación C que añade programación orientada a objetos y capacidades para la administración de gráficos.

Este post es una introducción a la sintaxis y semántica Objetive-C. Explorando los temas fundamentales de la programación orienta a objetos: declaración de clases, instancias de clases y métodos.

Declaración de Clases

En Objetive-C todas las clases constan de dos archivos la declaración del comportamiento (@interface – archivo .h) y su implementación (archivo .m). Es importante no confundir esta interfaces con las interfaces en lenguajes como C# o Java. Estas interfaces son únicas por clase en Objetive-C y describen el API para exponer propiedades y metodos de la propia clase. La gran mayoría de clases Objective-C derivan de la clase NSObject.

@interface MiClase : NSObject
@end
#import "MiClase.h"
@implementation MiClase
@end
Nombrado de Clases

Todas las clases en Objective-C tienen que tener un nombre único incluso las bibliotecas y frameworks utilizados. La convención es usar dos o tres siglas mayúsculas prediciendo el nombre de la clase. NS son las siglas usadas por Apple y es por eso que podemos encontrar clases como NSObject, NSString. En la pagina oficial del desarrollos se puede encontrar mas información del estándar y nomenclatura usada.

Métodos

Para declarar los métodos en una clase primero se establece el tipo de retorno, el nombre del método y finalmente los parámetros. El modificador (-) se usa para métodos de instancia y el modificador (+) para métodos de clase o (estáticos en C# y Java).

@interface MiClase : NSObject
-(NSString *)getString;
- (int)sumar:(int) value :(int) value2;
+ (void)imprimir:(NSString*)value;
@end
@implementation MiClase : NSObject
-(NSString *)getString
{
   // Implementación
}
@end

El código muestra la declaración de dos métodos de instancia clase y un método estático o de clase. La implementación se encuentra en el archivo MiClase.m. NSString es la clase mas común para la representación de cadenas en Objective-C. Todas las instancias de clase o objetos son punteros en Objective-C y se denotan con el operador (*).

Llamando métodos (Paso de mensajes)


ObjectiveC
Tomado de Apple Developer Library – working with objects



Objetive-C maneja funciona bajo un esquema conocido como paso de mensajes. Cuando necesitamos llamar el método por ejemplo imprimir en realidad la tarea que ejecutamos es mandar un mensaje al objeto con el texto que queremos imprimir. Para enviar mensajes usamos corchetes con el nombre del mensaje seguido de los parámetros del mismo.

NSString* texto = @"Texto";
[MiClase imprimir:texto]; // Mensaje sumar a la clase.
[objeto sumar:25 :32] // Mensaje sumar a la instancia de clase.

El código muestra el envío del mensaje imprimir a la clase mi MiClase.

Método Constructor

Los constructores son métodos normales que retorna el tipo de dato id además deben iniciar con la palabra init. Para hacer referencia a la instancia de clase actual se usa la palabra reservada self.

-(id)initMetodo
{
    self = [super init];
    return self;
}
-(id)initConPropiedad:(NSString *)value
{
    self = [super init];
    if (self) {
        propiedad = value;
    }
    return self;
}

El método constructor envía un mensaje a la clase Padre (NSObject) para llamar el método constructor y retorna la instancia.

Metodos de C

Como ya lo mencioné Objetive-C esta escrito sobre C por que podemos encontrar métodos que se llaman en el estilo de C sin hacer referencia a ninguna clase o utilizar la sintaxis de paso de mensajes. Sin embargo ambos tipos de mensajes son soportados y pueden utilizarse en un mismo programa o aplicación.

NSLog(@"log de prueba");
NSLog([MiClase getString]);

Metodos privados/públicos (Encapsulamiento).

En Objetive-C no existen los modificadores de acceso para los métodos. Sin embargo es posible crear métodos «privados». Para realizar esto no incluimos la declaración de los métodos en la interface de esa manera no pueden ser llamados externamente.

sobreCarga – sobreEscritura

La sobre carga (multiple firmas para el mismo método) es soportado en Objective-C es posible declarar el mismo método con multiples parámetros. En el caso de la sobre escritura (sobre escribir un método heredado) basta con declarar el método con exactamente la misma firma (Nombre. parámetros y tipo de retorno).

Propiedades o Atributos

Para crear los atributos de la manera convencional (declarando un atributo privado y construyendo accesadores). Es necesario crear el atributo y generar los metodos, En objective-C el estandar de nombrado es el mismo que para los accesadores es el mismo que para lenguajes como Java, C#, get y set.

@interface MiClase : NSObject
{
    NSString* _atributo;
}
-(NSString*)geAtributo;
- (void)setAtributo:(NSString*) value
@end

@property

Para declarar una propiedad sin escribir los métodos de acceso podemos usar la directiva @property, el compilador automáticamente generara la declaración e implementación de los getter y setters por nosotros (excepto para algunos casos específicos). Es posible modificar el nombre de los accesores especificando el nombre en la declaración.

@property int atributo1;
@property (getter=getAtrb2) int atributo2;
@property (setter=setAtrb3) int atributo3;

por defecto el compilador generara un get con el mismo nombre de la propiedad y un set con el nombre setPropiedad. Para acceder a las propiedades podemos usar el operador punto (.) o podemos utilizar los métodos accesores.

int number;
MiClase* objecto =[[MiClase alloc] init];

objeto.atributo1 = 5;
[objeto setAtributo1:5];

number = objeto.atributo1;
number = [objeto getAtributo1:5];

Además de especificar el nombre de los getter y los setter las propiedades pueden configurarse con directivas que definen su comportamiento. Algunas de estas son:

  • Readwrite (por defecto)/Readonly: como su nombre lo indica permite crear propiedades de solo lectura es decir no puede modificarse.
  • Atomic (por defecto)/Nonatomic: en un ambiente concurrente es posible que un método pueda ser accedido por multiples hilos al mismo tiempo. Por defecto las propiedades son marcadas como atómicas lo que significa que se genera un lock cuando un hilo esta accediendo a la información. Si quisiéramos implementar nuestro propio mecanismo de manejo de hilos podemos utilizar nonatomic.

Eso es todo! aun existen un sin número de características de Objective-C por explorar como la herencia, colecciones, listas e interfaces y componentes gráficos.