Subscribe Twitter Twitter

martes, 27 de abril de 2010

Los IBOutlet e IBAction

Los outlets y los actions son la manera que tenemos en programación para el iphone de conectar los elementos visuales (interface) con la funcionalidad de la aplicación, en función de cómo querámos controlar éstos elementos se usará o bien un outlet o un action.

Por ejemplo si lo que queremos es modificar un control visual por ejemplo poner texto en una label o recuperar info de la pantalla para ello se usan los outles, por el contrario si lo que queremos es que en función de un evento se ejecute una porción de código como por ejemplo que se realice una acción al pulsar sobre un botón, eso sería un action, pero... qué pasaría si quisieramos modificar en tiempo de ejecución por ejemplo el texto de un botón o su color, que también habría que definirlo como un outlet.

En el próximo post colgaré un video de un holamundo hecho en el iphone y de esa manera veremos como se realiza esta conexión entre el interfaz también llamado xib o nib y nuestro código.

viernes, 23 de abril de 2010

Objective-C : Métodos especiales: ALLOC e INIT

El método ALLOC

Es un método de clase que se encarga de reservar memoria para un objeto concreto en función de la clase que lo invoque, éste método no es necesario implementar absolutamente nada ya que todos los objetos heredan de la clase NSObject.

Persona persona = [Persona alloc];

El método INIT

El método init es por el contrario un método de instancia y se encargará de inicializar las variables/atributos, este método se puede implementar o invocar al método init de la clase padre (NSObject), por otro lado se pueden crear los métodos de inicialización como se quiera, lo que si es cierto que suelen seguir la nomenclatura initWith(algo identificativo)

- (id) InitWithInt: (int)valor_edad {
if (self == [super init]{
edad = valor_edad;
}
}

Como ves en el ejemplo le pasamos un valor entero para inicializar en concreto la edad, por otro lado lo que devuelve es una referencia al objeto actual por decirlo de alguna manera cuando se devuelve un tipo de dato id se devuelve un objeto de la clase actual.

Finalmente con [super init] inicializas el objeto invocando al método init de la clase padre y éste te devolverá una refencia al objeto actual que será el mismo que se almacena en la variable self cuyo significado es como el this de java. Y una vez nos hemos asegurado que estamos en el objeto correcto se procede a inicializar las variables, en este caso la edad.

Objective-C : Variables

En objetive-C las variables son normalmente punteros que apuntan a objetos independientemente del tipo que sea, bien es cierto que tenemos tipos primitivos como el int pero también tenemos su versión en objeto que es la clase NSInteger, por ello al igual que ocurriá en C cuando estamos hablando de punteros es inevitable tener que hablar de la gestión de memoria ya que se hace de manera manual, por lo tanto cuando tengamos una variable de tipo puntero será necesario antes de usarla reservar memoria (se hará con el método alloc) y una vez que hemos dejado de usarla se usará el método release para liberar la memoria que ocupe. Estos son unos conceptos básicos a la hora de desarrollar una aplicación ya que el iphone tiene limitada la memoria como hemos indicado en otro post por lo tanto todo lo que podamos hacer para evitar ocupar recursos sin necesidad será bien recibido. De todas maneras debido a la importancia de este concepto entraremos en profundidad más adelante.

Finalmente en objective-C a parte de reservar memoria es necesario inicializar los objetos mediante el método init del objeto correspondiente en el caso de que creemos una clase y no queramos tener ninguna inicialización particular, como todos los objetos heredan de NSObject se invoca al init del padre ( [super init] ).

Para los objetos de uso más habitual no es necesario hacerlo por lo que se puede hacer:

NSINteger* entero = 4;

NSString* cadena = @"Hola";


En el caso en el cual la inicialización sea dinámica esta manera no será válida y es necesario primeramente realizar un alloc y después el init.

Visibilidad

Al igual que en java en objective-c se puede limitar la visibilidad y el acceso de las variables mediante el uso de las directivas @public para variables accesibles desde cualquier clase de la aplicación y la directiva @private para variables accesibles SOLO desde la propia clase y desde las clases que hereden de la misma.

Objective-C : Métodos

Declaración:

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.

jueves, 22 de abril de 2010

Objective-C : Clases (I)

Las clases en objetive-C tienen mucha similitud a como se hacen en C, se separa el interfaz de la implementación, dicho de otra manera en un fichero se ponen las cabeceras de los métodos y las variables y en otro se pone la implementación de los métodos puestos en el interfaz.

A diferencia de C aquí el fichero interfaz (cabecera) tendrá extensión .h y el fichero de implentación tendrá extención .m.

A continuación vamos a ver un ejemplo para ver la estructura que siguen los dos ficheros ya que por cada clase que queramos crear deberemos divirla en dos.

Ejemplo.h

#import <Foundation/Foundation.h>
@interface Simple : NSObject {

}
-(void)hola;
@end

Ejemplo.m

#import "Ejemplo.h"
@implementation Ejemplo
- (void) hola{
NSMutableString *message = [[NSMutableString alloc] initWithString:@"Hello"];
NSLog(message);
[message release];
}
@end

En el fichero Ejemplo.h lo primero que se hace es importar la clase Foundation que es la base del framework de cocoa a continuación mediante la directiva @interface (equivale al "class" de java) se define el nombre que va a tener la clase y mediante : NSObject se indica que esa clase va a heredar de la clase NSObject a diferencia del lenguaje java en el cual se indica la herencia mediante la palabra reservada "extends", la clase NSObject es la raíz en la jerarquía de clases como pasa en java con la clase Object.
A continuación se definen las cabeceras (prototipos) de los métodos que se van a implementar en el fichero asociado .m.

En el fichero Ejemplo.m lo primero que se hace es un import del fichero de cabecera definido anteriormente y a continuación se implementan los métodos definidos en el .h en el ejemplo anterior lo que se hace es en una variable string se inicializa con la cadena Hola (En objective-C las cadenas siguen el siguiente formato @"hola " , a continuación se escribe hola en el log y finalmente se libera la memoria reservada para "hola", en objective-c la gestión de memoria no es automática como sucede en java sino que hay primero que reservarla y después liberarla, esto en concreto para el iphone es fundamental ya que la memoria del dispositivo es limitada.

El patrón de diseño DELEGATE

En programación para el iphone el concepto de delegado es muy habitual encontrarse con él, por ello vamos a dedicar este post a explicar como funciona para evitar que sea un problema cuando nos metamos en profundidad con el sdk.

En realidad tenemos un conjunto de funciones sin implementar que pueden ser "adquiridas" por cualquier objeto y que será éste el que escriba el código particular para esas funciones.

Por ejemplo imaginate que tienes en una aplicación un "picker" (que es un combo muy típico en cualquier aplicación del iphone) por ejemplo cuando pones la alarma del móvil en el cual seleccionas tanto la hora como los minutos pero el mio en vez de ser con número es con días de la semana, en ambos casos el nombre de los métodos que manipularan ese picker tendrán la misma firma ("signature") en otras la cabecera de la función será identica en todos los casos pero cambiará la implementación de cada una de ellas.

Como puedes ver aunque usamos la misma plantilla lo que cambia es la implementación, esto es el patrón delegado, por ejemplo en java ésto se implementa mediante le uso de las denominadas interfaces.



interface Persona {
void andar();
}

class Deportista implements Persona {

void andar(){

System.out.println("Estamos en el método andar de la clase Deportista");
}
}

class Jubilado implements Persona {
void andar() {
}
}


Como habrás visto en el ejemplo anterior tenemos un interfaz que funciona como plantilla denominado Persona y después hay dos clases que lo usan y para ello se usa la directiva en java implements (dedicaremos un post a la aplicación del patrón delegate en objetive-c) y en el primer caso al método andar se le provee de implementación y en el segundo caso no, ésto es para que veas que aunque tienes que poner el método no es obligatorio que tenga en su interior implementación pero si no lo pones daría un error.

martes, 13 de abril de 2010

Introducción a objective-C

Objetive C es un lenguaje de programación orientado a objetos y fué creado como un superconjunto de C, esto supone que se puede tanto importar librerías escritas en c como compilar código C lo cual le da mucha flexibilidad.

Teniendo en cuenta que lo que le diferencia a C es que es orientado a objetos por lo tanto toda la sintaxis no relacionada con objetos, clases... será exactamente igual a la sintaxis de C.

Dedicaremos un post a repasar la sintaxis básica en C para que así sea más sencillo afianzar la programación en objective-C.

Por otro lado en la parte de Objective-C orientada a objetos se diferencia del resto de lenguajes orientados a objetos en que cuando se invoca a un método de un objeto en objective C lo que se hace es enviar un mensaje a dicho objeto, de todas maneras objetive C es compatible con la invocación de métodos tradicional por lo tanto podremos hacer la misma acción con dos tipos de notaciones diferentes.

A continuación vamos a ver un pequeño ejemplo para ir familiarizándonos con esta nueva notación ya que al principio parece complejo pero en realizad si se coge el concepto es lo más fácil del mundo.

public class Persona {
String nombre;
String apellidos;

void caminar(int distancia){
}
}

Acabamos de definir la clase persona que tiene 2 atributos de tipo String (nombre y apellidos) y un método llamado caminar al cual se le pasa un parámetro entero que indica la distancia a recorrer.

¿Cómo invocamos al método caminar desde el objeto Pepe?
Partimos de que tenemos un objeto denominado Pepe ( más adelante veremos ciertas particularidades que hay en las clases y objetos) de momento vamos a ir entendiendo pequeños conceptos que evitarán que nos perdamos en la programación para el iphone.

En C++ lo haríamos así: Pepe -> caminar(30);

En Java por el contrario lo haríamos ... Pepe.caminar(30);

En cambio en objetive - C se haría : [Pepe caminar:30] si te das cuentas va todo con una notación diferente a la que estamos aconstumbrados pero el resultado en los 3 es el mismo, eso si , si no te gusta esta notación "especial" objetive-C soporta perfectamente la notacíón con el "." usada en java.

Si no tienes base en programación orientada a objetos pon un comentario y realizaremos una serie de post de programación orientada a objetos desde cero.

Introducción a la arquitectura del Iphone

La arquitectura del Iphone consta de 4 niveles:

Cocoa touch
Media
Iphone Os
Core services

Cocoa touch hace referencia tanto a la parte más baja de programación en cocoa como a la parte que se encarga de la gestión de los eventos táctiles (tocar, arrastrar, doble clic...), para poder implementar esto se hace uso de dos frameworks (o colecciones de clases) proporcionan el framework del iphone (foundation y uikit), el primero hace referencia a partes necesarias en cualquier aplicación a bajo nivel(sockets, hilos, colecciones...) y la segunda se encarga de la parte relacionada con el interfaz del iphone.
Foundation Framework
Proporciona recursos a bajo nivel básicos en el desarrollo de cualquier aplicación, entre ellos están los siguientes:
Tipos comunes de datos
InternacionalizaciónXmlSocketsHilosEntrada y salida (Archivos)LocalizaciónStringsÁrbolesPreferenciasColecciones de datos etc...
UIKit Es un framework encargado de la parte de interface del iphone: como etiquetas, cajas de texto, vistas, combos, controles... los diferentes elementos con los cuales puede interactuar el usuario, y los eventos relacionados con cada uno de ellos, por ejemplo doble clic, arrastar la información de un combo para elegir un elemento concreto... incluido el acelerómetro que se encarga de capturar el movimiento del iphone, éste control es muy usado sobre todo en juegos ya que se usa para controlar la propia aplicación.

Primer contacto con el Iphone SDK Kit Development

En primer lugar es necesario registrarse en la página de apple como desarrollador (http://developer.apple.com) este registro es gratuito y te permitirá acceder a recursos, información y herramientas de desarrollo.

Además por el mero hecho de estar registrado se tiene acceso a videos, tutoriales, compra de entradas a eventos de Apple y también se pueden enviar bugs pero esto normalmente no se usa.

A continuación es necesario descargarse un programa de desarrollo (XCode) que lleva incluidas una serie de herramientas que te serán muy útiles a la hora de depurar/crear/desarrollar aplicaciones, además también es necesario descargarse el framework correspondiente para
desarrollar para el iphone.

Para distribuir las aplicaciones a través de la appstore independientemente de si son de pago o no, es necesario pagar una licencia de 99dolares que te permitirá tener acceso a más herramientas (Dedicaremos a esto un post).

En el próximo post comenzaremos a adentrarnos en la architectura del iphone OS, esperamos que os resulte interesante.

Nota:
Siempre que hagamos referencia al iphone será también válido para ipod touch/ipad, en caso contrario se detallarán las peculiaridades para cada uno de los distintos dispositivos.

miércoles, 7 de abril de 2010

Bienvenidos

Este es un blog dedicado a toda la gente que quiere aprender a programar para el phone/ipod touch/ipad, desde cero pero con una mínima base de programación orientada a objetos, poco a poco tomaremos contacto con esta nueva plataforma de desarrollo e iremos profundizando hasta alcanzar un nivel avanzado pero sin dejar de estar al día e este mundillo por lo que con cierta asiduidas pondremos noticias/curiosidades y cosas interesantes relacionadas.

Esperamos vuestros aportes y sugerencias en formas de comentarios y de esa manera conocer vuestras inquietudes y mejorar de esta manera este blog.