Objective-C,

Primeros pasos con Iphone SDK (II): Métodos y ‘messaging’

Seguimos con la entrega, podeis enviarme aclaraciones, correcciones, sugerencias o regalos a tunelko arroba gmail punto com.

Vamos a seguir explicando cosas relacionadas con los métodos en Objective-C así como las diferencias de tipado en el código y otras cuestiones sencillas.

Cuando almacenamos objetos en variables siempre usamos un tipo de puntero. Objective-C soporta ambos tipados, tanto ‘strong typing‘ como ‘weak typing‘ para variables que contengan objetos. Los punteros ‘strong typing’ incluyen el nombre de la clase en la declaración del tipo de variable mientras que los tipos de punteros ‘weak typing’ usan el tipo ‘id’ en vez del objecto. Éste último tipado se usa frecuentemente para situaciones donde no conocemos el número exacto de tipos de objetos . Si estás acostumbrado a usar el tipado ‘strong’ pensarás que usar el ‘weak typing’ te va a traer problemas, pero proporcionan mas dinamismo  y flexibilidad en Objective-C.

El siguiente ejemplo muestra ambos tipados :

MyClass *myObject1; // Strong typing
id myObject2; // Weak typing

En la primera declaración, el signo * indica que las referencias a  objetos en Objective-C son punteros.

Métodos y Messaging

Una clase en Objective-C puede declarar dos tipos de métodos: métodos de instancia y de clase.Una instancia es un método cuya ejecución abarca una instancia particular de la clase. Lo que es lo mismo, antes de llamar al método debes crear la instancia de la clase. El método de clase no requieren crear esa instancia de la clase.

La declaración del método contiene el tipo de identificador del método, un valor de retorno, uno o mas nombres de métodos y los parámetros.

Lo vemos en este método de ejemplo : insertaObjeto:atIndex

- (void) insertaObjeto:(id)unObjeto atIndex:(NSUInteger)index

Desglosando:

: tipo de identificador del método

(void) : valor que espera devolver el método.

insertaObjeto:atIndex: Nombre del/los método/s.

(id)unObjeto: tipo de parámetro y nombre.

(NSUinteger)index: Tipo de parámetro y nombre de parámetro

La delcaración comienza por el signo menos (-) que indica que estamos declarando un método de instancia. El nombre del método (insertObject:atIndex:) es una concatenación de todos los nombres de método incluyendo  los signos de dos puntos (:). Éstos indican la presencia de parámetros. Si un método no contiene parámetros se omiten los dos puntos después del primer y único nombre de método. En este ejemplo el método tiene dos parámetros: unObjeto e index.

Cuando llamas a un método, lo haces haciendo ‘messaging‘ al objeto. El ‘messaging’ es la firma del método que envía información de parámetros que necesita. Todos los ‘mensajes’ que son enviados a los objetos se envían de forma dinámica para facilitar el polimorfismo o la sobrecarga de métodos en las clases Objective-C.

Los ‘mensajes’ van encerrados entre corchetes ‘[ ]’ y dentro de éstos corchetes el objeto recibe el mensaje en su parte izquierda y el mensaje acompañado  por los parámetros que requiera, a la derecha.

Ejemplo: Para enviar el mensaje insertaObjecto:atIndex: a un objeto en la variable miArray, pondremos ésto:

[miArray insertaObjeto:unObjecto atIndex:0];

Para evitar que se declaren muchas variables locales que almacenan resutlados temporales, Objective-C permite anidar mensajes. El valor devuelto por cada mensaje anidado es usado como parámetro o como otro mensaje. Por ejemplo, podrías reemplazar cualquiera de las variables del ejemplo anterior con mensajes para recojer sus valores. Esto, si tienes otro objeto llamado unObjeto que tuviera métodos para acceder al array y al objeto a insertar en el array, podrías escribirlo de la sigueinte manera:

[[miObjeto miArray] insertaObjeto:[miObjeto objetoAInsertar] atIndex:0];

Objective-C también permite invocar métodos llamados ‘accesor’, es decir, métodos que establecen y devuleven valores de variables del objeto. Son iguales a los ‘getters’ y los ‘setters’ o actúan de la misma manera. Tienen la siguiente sintáxis:

- (tipo)NombrePropiedad y -(tipo)setNombrePropiedad:(tipo).

Por ejemplo, podríamos reescribir el ejemplo anterior con la sintaxis siguiente, usando el punto de jerarquía:

[miObjeto.miArray insertaObjeto:[miObjeto ObjetoAInsertar] atIndex:0];

Puedes uasr la sintáxis del punto para la asignación:

miObjeto.miArray = minuevoArray;

Esto no es más que escribir de forma diferente, ésto:

[miObjeto setMiArray:minuevoArray];

En la próxima entrega, veremos ya algunos listados de ejemplo repasando todos éstos conceptos. No será hasta la entrega IV cuando realicemos la priemra y sencilla aplicación para nuestro Iphone.