martes, 9 de agosto de 2011

Redimenciomar imagen / resize Image / UIImage

    UIImage*imgStorage = [self resizeImage:imgStorage2];


-(UIImage *)resizeImage:(UIImage *)image {
    int width, height;
   
    width = 300;
   
    int w_porcentaje = ((width*100)/image.size.width);
    int h = ((image.size.height*w_porcentaje)/100);
   
    height=h;
    CGImageRef imageRef = [image CGImage];
    CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(imageRef);
   
    //if (alphaInfo == kCGImageAlphaNone)
    alphaInfo = kCGImageAlphaNoneSkipLast;
   
    CGContextRef bitmap = CGBitmapContextCreate(NULL, 300, 200, CGImageGetBitsPerComponent(imageRef), 4 * width, CGImageGetColorSpace(imageRef), alphaInfo);
    CGContextDrawImage(bitmap, CGRectMake(0, 0, width, height), imageRef);
    CGImageRef ref = CGBitmapContextCreateImage(bitmap);
    UIImage *result = [UIImage imageWithCGImage:ref];
   
    CGContextRelease(bitmap);
    CGImageRelease(ref);
   
    return result; 
}

lunes, 8 de agosto de 2011

Barra de loading agregada a un UIView

    //x,y,w,h
   
    UIView *progView = [[UIView alloc] initWithFrame:CGRectMake(110, 110, 95, 30)];
    progView.backgroundColor = [UIColor grayColor];
    progView.tag = 1;    // tag this view for later so we can remove it from recycled table cells
    progView.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin);
    //progView.layer.cornerRadius = 5;
   
   
    UILabel *activityLabel = [[UILabel alloc] init];
    activityLabel.text = NSLocalizedString(@"Loading...", @"string1");
    activityLabel.backgroundColor = [UIColor grayColor];
    activityLabel.textColor = [UIColor whiteColor];
    activityLabel.font = [UIFont systemFontOfSize:14];
    [progView addSubview:activityLabel];
    activityLabel.frame = CGRectMake(5, 2, 70, 25);
   
    UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
    [activityIndicator startAnimating];
    [progView addSubview:activityIndicator];
    activityIndicator.frame = CGRectMake(70, 5, 20, 20);
   
   
    [self.view addSubview:progView];
    


viernes, 29 de julio de 2011

Como crear mi propio Mapa en Google Maps.



Google Maps 5.8 for Android adds photo uploads, My Places, and more

Google Maps 5.8 for Android improves Places and Latitude with:
  • Upload photos for a Place
  • My Places as a simple way to manage the Places you’ve starred and recently viewed
  • Descriptive terms for Places in search results
  • Add a new Place on-the-go when checking in
Photo upload for a Place

When deciding on a place to go, people often want to know what a place looks like in addition to seeing ratings and reviews. You can now contribute photos to help others get a sense of places. You can now attach your photos to Places, and yours may even become the profile picture for that page. If you want to view or delete any photos you’ve contributed to Places, you can manage uploaded photos in the “Photos for Google Maps” album on your Picasa account.

Left: Uploading pictures to a place. Right: Photos in Android Gallery

My Places and descriptive terms for mobile

In June we announced descriptive terms and ‘My Places’ for the desktop. Both these features are now in Google Maps for mobile. Descriptive terms appear in search results for Places to inform you what businesses are ‘known for,’ such as their ‘eggs benedict’ or being ‘worth the wait.’

Also, My Places for mobile provides quick access to starred and recent Place pages you’ve looked at. You can access My Places by pressing your phone’s menu button while in Google Maps.

Descriptive terms and My Places in Google Maps for mobile

Add a new Place ‘on-the-go’ for check-ins

If you’re out and about and want to check in, we want to make sure you can quickly add a new Place to check into if one isn’t available. This might happen for new businesses or those that haven’t set up a Place page yet. For example, let’s say you’re at Xoogle Xtreme Sports, a new sports shop in your neighborhood. You go to check in but don’t see Xoogle in the list of places to check into and when you do a search still nothing comes up.

Add a Place when checking in, if needed

To solve this, you’ll now see an “Add place” option at the bottom of suggested places. Select that option, and you’ll be prompted to confirm the name and location of the new place. Then a brand new place is added (and you’re checked in). This place will be available for you and others to check into from Latitude, but will not appear as a search result in Google Maps or Google Places.

We’ve also added ‘Bigger text’ to our experimental Labs features and ‘Download map area’ has been renamed ‘Pre-cache map area.’

To start using Google Maps 5.8 for Android, download the update here. This update requires an Android OS 2.1+ device and can be used anywhere Google Maps is currently available. Learn more in our help center.

domingo, 19 de junio de 2011

Energia Solar




600w grid tie inverter14v-28vdc to 220vac, for solar

Energía Solar Fotovoltaica

Energía Solar Fotovoltaica

La energía solar fotovoltaica, es la energía eléctrica que se produce de las energías que entrega el sol, a través de la radiación solar. A través del fenómeno fotovoltaico, la radiación solar incidente en el panel solar, genera la conversión de energía solar a energía eléctrica en corriente continua (CC), la cual se encuentra generalmente entre 12, 24 y 48 Volts. Esta energía puede ser almacenada en baterías, para su posterior uso, o ser inyectada directamente a la red, transformándola antes en corriente alterna (220 Volts) a través de un inversor. La energía fotovoltaica se clasifica en dos categorías:

• Energía fotovoltaica aislada: Generación de energía eléctrica para autoconsumo, almacenando la energía eléctrica en baterías, en corriente continua, luego esta se transforma en corriente alterna, a través del inversor y puede ser usada en la mayoría de los equipos eléctricos de una casa. Este tipo de instalaciones de usa mucho en casas que no tienen acceso a la red y combinan este tipo de tecnologías con un generador para poder tener una autonomía del 100% durante todo el día y la noche, ya que la energía fotovoltaica no puede generar electricidad durante la noche.

• Energía Fotovoltaica de Red: Generación de energía eléctrica para inyectarla a la red, este tipo de instalaciones, mientras produce energía eléctrica, la entrega automáticamente a la red durante el día. La generación de corriente continua de los paneles fotovoltaicos, luego es convertida en corriente alterna a través de los inversores, generalmente a 220 Volts o 400 Volts en trifásico, luego esta energía para ser inyectada a la red, se le debe elevar su voltaje a través de los inversores, para evitar perdidas de energía eléctrica en el transporte de energía por el tendido eléctrico.

viernes, 21 de enero de 2011

Objective-C, Xcode And Interface Builder.

Objective-C,  Xcode And Interface Builder.


Day One:
Xcode interface









¿Y por donde empiezo?
Lo primero que debemos tener en cuenta es que para desarrollar aplicaciones para al Iphone/Ipad es necesario tener un Mac o bien una Virtualizacion del Mac, ya que el programa que se utiliza para el desarrollo de estas solamente corre sobre el sistema operativo Mac OS.

    Utilizaremos principalmente la herramienta de desarrollo Xcode, que proporciona Apple, junto con el SDK (Software Development Kit) del Iphone, lo podemos descargar de la página de desarrolladores de Apple para lo cual será necesario nuestra identificación mac (la misma que utilizamos en la App store). Apple proporciona un programa de asistencia al desarrollador por un precio de 99 $ al año, el cual posteriormente nos permitirá subir nuestras aplicaciones a la App Store.

    Xcode por así decirlo será nuestra navaja suiza en el desarrollo de aplicaciones para el Iphone/Ipad. Incorpora tanto nuestro compilador, nuestra herramienta para creación de interfaces y un simulador de Iphone en el cual podremos comprobar el aspecto y funcionamiento de nuestra aplicación.

    Utilizaremos el lenguaje de programación Objective-C, ya que es este es el que permite el desarrollo de aplicaciones en código nativo.
    Objective-C es un superconjunto del lenguaje de programación C, es un código primordialmente orientado a objetos que a diferencia de la programación tradicional.


La interfaz de Xcode

Nos encontraremos con la siguiente pantalla.




En ella podemos seleccionar:

- Abrir un proyecto reciente.

- Crear un nuevo proyecto.

- Hacer un tour por Xcode

- Conectar con el servicio para desarrolladores de Apple.

Crearemos un Nuevo Proyecto.



Donde lo Guardo el proyecto?




     - Paseo por el Menu de Xcode. [Project] [Builder] [Run] [SCM]
      -Classes(Como creo grupos)
      - Resource
      - Frameworks (solo mostrar, NO IMPORTAR es otra clase)
     - Plist (nombre Aplicacion -Iconos - Bundle identifier=nombre de tide)















Understanding our first program in Objective-C

Ahora que ya estamos familiarizados con como compilar y ejecutar un programa, vamos a pasar a comprender como funciona este.

// First program example

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

// insert code here…
NSLog(@”Hello, World!”);
[pool drain];
return 0;
}

Una de las particularidades que tiene la programación en Objective-C, es que es distintivo escribir en mayúsculas o minúsculas, es decir, que un comando no tiene el mismo funcionamiento dependiendo de cómo lo escribamos con mayúsculas o minúsculas (o incluso puede no funcionar al escribirlo de forma distinta) por lo que debemos respetar estas cuando escribamos un programa.
La primera línea del programa, Introduce un comentario
// First program example
,
Existen dos formas de introducir comentarios en nuestro programa.
1 .-  introduciendo dos barras (//) .
2.-  introducir los caracteres /*…..*/
/*Esto es una línea de comentario
Bienvenidos a Estudioiphone….
Curso de desarrollo de aplicaciones Iphone-Objective-C*/

La siguiente línea:
#import <Foundation/Foundation.h>
Foundation.h es un archivo de sistema, con el comando #import damos la orden de incluir el contenido de ese archivo en nuestro programa. Este archivo se importa porque contiene la información de las clases y funciones que se utilizarán posteriormente en el programa.
int main (int argc, const char * argv[])
Main es un nombre especial que nos indica realmente donde se inicia el programa. La palabra reservada int, indica el tipo de valor que devuelve main. De momento ignoraremos los comandos que aparecen entre paréntesis.
Ahora que ya hemos identificado main debemos comienza lo que realmente queremos que haga nuestro programa, lo cual debe aparecer entre corchetes {…}
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Es una sentencia que reserva un espacio en memoria  para nuestro programa, hablaremos también de esto más adelante.
La siguiente línea invoca la rutina NSLog, el parámetro que se le pasa debe ir acompañado de @ y dobles comillas, a este parámetro se le conoce como constante NSString.
La rutina NSLog es una función de la librería Objective-C cuya función es mostrar el parámetro que se le pasa, acompañado de la fecha y hora de ejecución, el nombre del programa y otros números.
Todas las sentencias que se escriben en Objective-C deben finalizar con ;
Una vez finalizado el cometido del programa, se debe liberar la memoria que hemos reservado previamente con [pool drain];
La última línea de comando return 0; indica la devolución del código 0 en caso de que nuestro programa haya finalizado correctamente.
Finalmente finalizamos cerrando nuestro programa con }.
Como posible fórmula para practicar propongo escribir varias líneas como las de este programa en distintas líneas sabiendo que el código de retorno de carro es \n.
el comando NSLog nos sirve para mostrar frases a través delterminal, pero este comando no sirve únicamente para esto, NSLog también nos permite mostrar el resultado de operaciones aritméticas.

#import <Foundation/Foundation.h>

int main (int argc, const char *argv[]) {

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

int sum;

sum = 50 + 25;

NSLog (@”The sum of 50 and 25 is %i”, sum);

pool drain];

return 0;

}

La primera línea de comando dentro de main después de reservar el espacio de memoria con NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];, declara una variable de tipo Integer , todas las variables del programa se deben definir antes de utilizarlas, estas especifican al compilador como se deben usar en el programa. El compilador necesita esta información para generar las instrucciones correspondientes al almacenamiento y devolución de los valores correspondientes a estas variables. Existen distintos tipos de variables que veremos másadelante.

La variable sum almacena el resultado de la suma de dos valores (los cuales son también de tipo int) 50 y 25.

sum = 50 + 25;

El comando NSLog tiene ahora dos argumentos entre paréntesis separados por comas, el primer argumento es siempre la cadena de caracteres que se quiere mostrar, si se quiere mostrar el valor de una variable acompañado de esa cadena de caracteres se debe utilizar un carácter especial reconocido por el comando NSLog, este es el % el cual va acompañado por el identificador de tipo de variable en este caso la i que le indica que es una variable integer. Cuando el comando NSLog encuentra el carácter especial %i este es substituido por el valor del argumento que esta detrás de la coma.

NSLog (@”The sum of 50 and 25 is %i”, sum);

EJERCICIO: Al igual que en el ejemplo anterior hemos almacenado en la variable sum el resultado de la suma de dos constantes, propongo como ejercicio modificar el programa para mostrar a través de pantalla la suma de dos variables.


Classes, objects and methods, the basis of object-oriented programming.



En el post de hoy trataremos quizás el concepto más importante de la programación en Objective-C, es por lo tanto fundamental comprender esto para nuestros futuros desarrollos. Intentaré por lo tanto utilizar una terminología y ejemplos lo más sencillos posibles.

¿Qué es un objeto?

Un objeto es una cosa, pensemos en la programación orientada a objetos como una serie de acciones que queremos realizar con esa cosa.

Consideremos una cosa de la vida cotidiana, por ejemplo nuestro coche, el cual tiene diversas características como pueda ser el lugar de fabricación, el número de bastidor que lo hace único e identifica a ese coche…

En el lenguaje de programación orientado a objetos tu coche es una instancia de un vehículo, continuando con la terminología, vehículo es la clase a partir de la cual esta instancia fue creada, de tal modo que cada vez que se fabrica un coche nuevo, una instancia de la clase vehículo es creada, y cada instancia de vehículo esta referenciada a un objeto.

Tu coche puede tener determinadas características como puede ser el color, el tipo de coche… y además puedes realizar determinadas acciones con él, conducirlo, echarle gasolina, lavarlo…al igual que estas acciones se pueden realizar con cualquier otro coche.

Instancias y métodos

Una ocurrencia única de una clase de denomina instancia y las acciones que puede realizar esta se denominan métodos, en determinados casos los métodos se pueden aplicar a una instancia o a la clase en sí. Por ejemplo, lavar el coche se aplica a una instancia, pero también se puede aplicar al resto de instancias de la clase vehículo, por lo tanto se trata de un método de clase. Ahora bien supongamos dos coches de la clase vehículo los cuales han salido de la misma cadena de montaje y son exactamente iguales. Pasado un tiempo desde su entrega a sus correspondientes propietarios cada uno de ellos adquiere unas características propias de cada uno, por ejemplo uno puede tener un arañazo y el otro haber hecho muchos kilómetros por lo tanto cada objeto contiene no sólo suinformación inicial, sino que además contiene información propia la cual puede cambiar dinámicamente.

Aplicar un método a un objeto puede variar a su estado. Si tu método por ejemplo es rellenar el depósito, después de que este se aplique, habrán variado las características de ese objeto.

El concepto clave en este caso es que un objeto es una representación única de una clase el cual contiene información (datos) privados de ese objeto los cuales se pueden acceder y manipular mediante métodos.

La sintáxis para aplicar un método en Objetive-C es:

[ ClaseOInstancia metodo ];

Escribiendo entre corchetes primero el nombre de la clase u objeto y después el método a aplicar, cuando a una clase u objeto se le aplica un método, se dice que se le esta enviando un mensaje, por lo que otra forma de ver la sintáxis es:

[receptor mensaje];

Volvamos al ejemplo de nuestro coche, cuando vamos a cómpralo lo primero que debemos hacer es pedirlo a la fábrica.

Tucoche = [Coche nuevo]

Mandamos un mensaje a la clase coche, y lo almacenamos en la variable Tucoche, a partir de entonces esta variable se puede utilizar para referirnos a tu instancia de coche, a partir de entonces todos los métodos que apliquemos a la variable como puedan ser [Tucoche conducirlo]: [Tucoche lavarlo]; [Tucoche leercuentakilómetros]* se tratarán de métodos de instancia.

* En este caso se trata de un método que nos devuelve información.
Trabajando con clases

Este es el quinto tutorial para aprender a hacer tus propias aplicaciones para iPhone, si te perdiste algún artículo, los tienes aqui.

Hoy vamos a realizar nuestro primer programa trabajando con clases y métodos. Supongamos que tenemos queescribir un programa para trabajar con fracciones, sin los conocimientos necesarios sobre clases, nuestro programa sería algo similar a esto:

// Programa simple para trabajar con fracciones

#import <Foundation/Foundation.h>

int main (int argc, char *argv[])

{

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

int numerador = 1;

int denominador = 3;

NSLog (@”La fracción es %i/%i”, numerador, denominador);

[pool drain];

return 0;

}

En este programa la fracción esta definida por el numerador y denominador, variables a las cuales se les asigna losvalores 1 y 3, este es el mayor problema precisamente de implementar nuestro código de esta manera, ya que si necesitaramos almacenar múltiples variables deberíamos definir un par de variables para cada fracción. Mediante el uso de clases podemos definir una fracción como una entidad y referirnos únicamente a un denominador y a un numerador.

// Programa para trabajar con fracciones – trabajando con clases

#import <Foundation/Foundation.h>

// —–INTERFACE —–

@interface Fraccion: NSObject

{

int numerador;

int denominador;

}

-(void) imprimir

-(void) setNumerador: int n;

-(void) setDenominador: int d;

@end

//—-IMPLEMENTACION—–

@implementation Fraccion

-(void) imprimir

{

NSLog(@”%i/%i, numerador, denominador);

}

-(void) setNumerador: int n

{

numerador = n;

}

-(void) setDenominador: int d

{

denominador = d;

}

@end

//—-PROGRAMA—-

int main (int argc, char *argv[])

{

NSAutoreleasePool * pool = [NSAutoreleasePool alloc] init];

Fraccion *miFraccion;

// Creamos una instancia de una fracción

miFraccion = [Fraccion alloc];

miFraccion = [Fraccion init];

//Fijamos el valor de la fraccion a 1/3

[miFraccion setNumerador: 1];

[miFraccion setDenominador: 3];

//Mostramos la fraccion usando el metodo imprimir

[miFraccion imprimir];

[miFraccion release];

[pool drain];

return 0;

}

El programa que hemos escrito esta perfectamente diferenciado en tres secciones:

- Interface

- Implementación

- Programa

La interface describe la clase , sus datos y sus métodos, la implementación contiene el código de los métodos a utilizar en la clase y finalmente el programa contiene el código para el propósito final del programa en sí mismo.

Un programa cualquiera de Objective-C contiene estas tres secciones las cuales normalmente suelen estar cada una en un fichero especifico pero para una mejor comprensión en nuestro ejemplo implementaremos las tres en un solo fichero.

En próximas entregas explicaremos más a fondo cada una de estas secciones.
La Interfaz


Declaring and managing properties


En el ejemplo anterior hemos creado getters y setters para poder acceder a los atributos de la clase, pero en la versión 2.0 del lenguaje se incorporó una forma menos dura y más natural, que consiste en una idea similar a las propiedades de C#. Primero hay que definir la propiedad en la interfaz de la clase con:

@property tipo nombre; @property (atributos) tipo nombre;

Como se puede ver, los atributos, son opcionales y ya veremos cuáles son los que actúan por defecto:

Métodos para acceder:
    *    getter=nombre → Por defecto, si no se indica nada, el getter tendrá el mismo nombre que
                        el identificador de la propiedad.
    *    setter=nombre → Por defecto, si no se indica nada, el setter tendrá como nombre al
                        identificador de la propiedad precedido de la palabra set. Por ejemplo, si nuestra
                        propiedad se llama name, el setter por defecto sería setName.
Escritura o solo lectura:

    *    readwrite → Es una de las opciones por defecto en la definición de las propiedades,
                    por lo que no hace falta ponerlo, y lo que permite es que se pueda leer y escribir su contenido.
    *    readonly → Esta opción indica que la propiedad es solo de lectura.

Tipo de asignación:
    *    assign → Se realiza la asignación sin invocar a retain. Este tipo se suele utilizar para propiedades de tipos que no son objetos como int.
                Por defecto una propiedad utiliza esta opción, por lo que es algo que se suele indicar al definir las propiedades,
                ya que lo normal es trabajar con objetos con bastante frecuencia.
    *    retain → Se realiza la asignación invocando a retain.
                Este tipo solo se puede utilizar para propiedades de tipos que son objetos de Objective-C.
    *    copy → Se le asigna a la propiedad una copia del objeto pasado al setter. 

Atomicidad:
    *    atomic → Es la opción por defecto y lo que hace es bloquear la asignación para que ningún hilo que esté ejecutándose
                al mismo tiempo, pero no haya sido el que ha invocado al setter, no pueda modificar la propiedad mientras lo está haciendo otro hilo.
    *    nonatomic → En esta opción no hay bloqueo, por lo que cualquier hilo puede modificar el valor sin tener que esperar a que termine el otro.
                    Esto obviamente puede ser problemático, pero en aplicaciones que solo tienen un hilo se utiliza esta
                    opción para ahorrar operaciones inútiles que no servirían de nada.

Definidas las propiedades en nuestra clase viene la implementación y para ello se utiliza:

@synthesize nombre; @synthesize nombre = nombreAtributo;

Con @synthesize lo que le estamos indicando al compilador es que si el programador no ha creado los métodos a mano, que los cree automáticamente.


Existe la opción de sobre-escribir propiedades definidas en clases padres, protocolos (que son el equivalente a las interfaces de Java o C#) o de las categorías, pero tan solo se puede cambiar opción sobre si es de lectura/escritura o solo de lectura no puede ser alterada en la sobre-escritura, el resto tendrán que ser iguales a la definición original.

Luego tenemos algunas peculiaridades sobre las propiedades. Por ejemplo al indicar la opción copy tendremos problemas si el tipo de la propiedad es un objeto “mutable”, porque el método copy devuelve objetos que no se pueden modificar después de inicializados. Por ello, el programador tendrá que crear a mano el setter y usar mutableCopy como método para copiar el objeto pasado al método.

Otra peculiaridad “rara” tiene que ver con dealloc, ya que por extrañas circunstancias las propiedades de objetos que son sintetizadas no te permiten invocar a release desde dealloc, que es la forma normal de trabajar cuando no se usa propiedades. Lo que tienes que hacer es asignarle el valor nil a la propiedad de alguna de las dos siguientes formas:

// Forma A [self setNombre:nil];

// Forma B self.nombre = nil;

Y todo esto es lo que hay que hacer para poder utilizar el operador punto, para acceder a los atributos de la clase, en vez de utilizar un método get o set, y lograr que programar en este lenguaje parezca más “natural”.



Protocols.

Para los programadores de Java y C# las interfaces son un concepto bien conocido y útil.
Se declaran así:

@protocol Nombre <NombreProtocoloPadre1, ... , NombreProtocoloPadreN> // Declaración de métodos cuya implementación es obligatoria

@optional     // Declaración de métodos cuya implementación es opcional

@required     // Declaración de métodos cuya implementación es obligatoria

@end
Lo primero que uno puede ver es que los protocolos pueden heredar de uno o varios protocolos, que también pasa en otros lenguajes utilizados hoy en día. Lo segundo y sorprendente es que existen métodos que podemos indicar como opcionales su implementación.

Y lo tercero es que la sección @required es completamente “inútil”, ya que en la sección por defecto actúa de la misma forma. Esta es la forma formal para especificar un protocolo, existe una informal que consiste en hacer una categoría (un concepto que se verá de forma más extensa en el siguiente apartado de la guía) sobre NSObject, con lo que todo el mundo tendría los métodos de este protocolo informal:

@interface NSObject (Nombre)
// Declaración de métodos
@end
El caso es que siguiendo con los protocolos formales, la forma de indicar que una clase va a implementar uno en particular es la siguiente:

@interface NombreClase <NombreProtocolo1, ... , NombreProtocoloN > { // Declaración de atributos
}
// Declaración de métodos y propiedades
@end

Pero para anticipar a los problemas existe un par de métodos interesantes para comprobar si podemos trabajar tranquilamente con una clase, el primero es conformsToProtocol, que comprueba si el objeto que lo invoca tiene implementados todos los métodos obligatorios de un protocolo. El segundo es respondsToSelector, que comprueba si existe un método en el objeto que lo invoca. Que ya dicho sea de paso, para Objective-C los selectores son algo así parecido a los punteros a funciones, que podemos pasárselo a una función para que esta lo use invocándolo, pero como es un tema complicado lo mejor esmirar la documentación oficial para comprender el tema mejor. De momento nos quedaremos con un ejemplo de cómo se utilizan los dos métodos que acabamos de comentar:
BOOL result = [nombreObjeto conformsToProtocol:@protocol(NombreProtocolo)];
BOOL result = [nombreObjeto respondsToSelector:@selector(nombreMetodo)];
Al indicar el tipo de una variable podemos asignarle una instancia de esa clase o la de alguna clase hija en su jerarquía. Con los protocolos también podemos hacer lo mismo, para limitar la clase de datos que se pueden instanciar en una variable:
NombreClase <protocolos, ...> * nombreVariable;
id <protocolos, ...> * nombreVariable; De la primera forma tendrá que cumplir los protocolos indicados y ser parte de la jerarquía de la clase
indicada. De la segunda forma puede ser cualquier clase, pero tendrá que cumplir los protocolos indicados.

The categories.

Las categorías:
Puede ocurrir que uno desee extender la funcionalidad de una clase cualquiera y las categorías es la forma de realizar esto (en otros lenguajes dinámicos existen cosas parecidas, al igual que en C#). La sintaxis para definir e implementar una categoría es sencilla, detrás del nombre de la clase se pone entre paréntesis el nombre de la categoría y asunto resuelto:
#import "Victima.h"
@interface Victima (Nombre)
// Definición de los miembros
@end

En el fichero de implementación .m iría un código parecido a este:
#import "Victima+Nombre.h"
@implementation Victima (Nombre)
// Implementación de los miembros
@end
Razones para extender clases existentes hay muchas y que cada cual encuentre la que más rabia le dé. Se pueden sobre-escribir métodos de las clases superiores en la jerarquía, pero obviamente no se puede hacer lo mismo con las de la clase u otras categorías anexionadas a esta clase. Además hay que tener cuidado de qué métodos añadimos y a quién, porque podría provocar que implosione nuestro programa.

468x60