Los métodos en objetive-c al igual que en java había dos tipos de métodos:
- de instancia: son aquellos que solo pueden invocarse desde un objeto instanciado previamente.
- los de clase: son aquellos métodos en los que se invocan desde la clase directamente.
En java para diferenciarlos se usa la palabra reservada static al comienzo de la declaración del métodos de clase, en los métodos de objeto no se pone nada.
En objective-C se pone siempre un símbolo al comienzo de la cabecera del método y de esa manera sabremos si es un método de clase o de instancia.
+: métodos de clase.
-: para los métodos de instancia.
Por lo que lo más habitual será encontrarnos con métodos que comiencen por -.
Ejemplo en Java:
public
static
void actualizarCoordenadaX(int coord_x);
public void
actualizarCoordenadaX(int coord_x)
;
El public es la visibilidad que tiene el método.
Ejemplo de Objective-C:
+(
void)
actualizarCoordenadaX(int coord_x)
;
-(void)
actualizarCoordenadaX(int coord_x)
;
Invocación:
En realidad en Objective-C se habla de envío de mensajes porque es como en realidad funciona por debajo pero a efectos de entender que hace es invocar el método.
En Java se usa la notación del "." : pepe.
actualizarCoordenadaX
(nueva_x);En Objective-C se puede hacer con la notación del "." pero normalmente se hace con la notación del envío de mensajes: [pepe caminar].
Nota: (VARIOS PARÁMETROS aquí lo de que sea de método o clase es indiferente)
Declaración:
Ejemplo en Java:
public
void actualizarCoordenadasXY(int coord_x,int coord_y);
Ejemplo de Objective-C:
Cuando enviamos un mensaje con varios parámetros resulta un poco complejo debido a que el nombre del método (denominado selector) se divide, si aunque suene raro, voy a poner un ejemplo para que se vea de manera más clara lo que sucede:
- (void) actualizarCoordenadasX: (int) coord_x Y: (int) coord_y;
El nombre del método es en realidad actualizarCoordenadasXY y como primer parámetro recibirá un entero para la coordenada X (
coord_x)
y otro entero para la coordenada Y (coord_y)
y será un método de instancia (-) y no devuelve ningún dato (void)Invocación:
Ejemplo en Java:
satelite.actualizarCoordenadasXY(coord_x,coord_y);
Ejemplo en Objective-C:
Para enviar el mensaje y que se ejecute este método se realizaría de la siguiente manera:
[satelite actualizarCoordenadasX: nueva_coordenada_x Y: nueva_coordenada_y]
Por la experiencia que tengo en programar para el iphone en mi caso no ha sido necesario pasar varios argumentos pero no está de más entender un poco como va para futuras aplicaciones y necesidades.
Anidamiento de mensajes (invocación de métodos)
Persona pepe;
pepe = [ [Persona alloc] init]
Lo primero que se ejecuta es Persona alloc que devuelve un espacio de memoria reservado para un objeto y a continuación se invoca el método init de ese objeto que lo que hace es inicializar los atributos del objeto pepe al que finalmente se le asignará.
Como vemos cuando hay anidamiento hacemos como con las sumas y los paréntesis, de dentro hacia fuera. Por lo tanto en Primer lugar se ejecuta [ Persona alloc], Persona es el nombre de la clase (por eso lo he puesto con la primera en mayúsculas) y lo que hace es invocar al método alloc por lo tanto el método alloc es un método de clase, ésto nos devuelve un objeto de tipo Persona pero sin contenido (un trozo de memoria) que a su vez ahora invocamos a init que es el encargado de inicializar los atributos de la clase, e init es un método de objeto que devuelve un objeto que a su vez se lo asignamos al objeto pepe.
Es imprescindible que el mensaje anidado (en este caso Persona alloc) devuelva un objeto ya que se invoca a continuación al método init (ques un método de objeto) que devuelve el objeto que ha invocado el init.
2 comentarios:
En primer lugar felicidades por el blog. Me he propuesto aprender a desarrollar para iphone este verano, y gracias a trabajos como el vuestro, lo veo más sencillo.
Sólo quería comentar que en el primer ejemplo de Java, falta void en el caso de ser estático el método:
public static actualizarCoordenadaX(int coord_x);
public void actualizarCoordenadaX(int coord_x);
Un saludo y nos seguimos leyendo :)
Error del directo, ya está actualizado :), gracias
Un saludo
Noemí
Publicar un comentario