miércoles, 2 de noviembre de 2011

Breve descripción de "Introspection"

 Hola a todos! tiempo sin publicar nada. Espero estas semanas poder compartir mas de lo que vaya aprendiendo.

Ahora expondré una breve descripción de los métodos que existen en la clase NSObject para poder saber de que clase es un objeto en especifico o si puede implementar un método particular.

Actualizado 8-11-11 - Ejemplo de selector

Súper útil, sobretodo cuando programamos métodos que pueden utilizarse en distintos objetos o cuando tomamos ventaja de la herencia en POO.

Todos los objetos que hereden de NSObject, conocen estos métodos.

 isKindOfClass: este método retorna si un objeto es de una clase particular (incluye herencia). Por lo tanto reconoce si el método hereda de la clase con la que lo comparamos. Aquí se pregunta "¿eres de esta clase, o heredas de ella?"

isMemberOfClass: este método es similar al anterior pero no incluye herencia, por lo tanto es mas especifico y arroja información quizás mas útil. Aquí se pregunta "¿eres de esta clase específicamente?"

respondsToSelector: retorna si un objeto responde a un método especifico sin importar a que clase pertenece. 

Syntaxis

Los métodos para evaluar clases reciben una Class. Se obtiene una Class al enviar al método de clase una class. Si lo se, son muchas veces class pero es así!.

if ( [obj isKindOfClass: [NSString class]])
{
    NSString *s = [ (NSString *) obj stringByAppendingString: @"xyz"];
}
Si esto es cierto, entonces no habrá problema al mandarle el mensaje al objeto obj ya que fue verificado.
En el caso de la evaluación de métodos, se recibe un selector (SEL). La directiva especial @selector convierte el nombre de un método en un selector. 

if( [obj respondsToSelector: @selector(metodo)])
{
     [obj metodo];
}

SEL es el type de Objective-C para selector

SEL metodoSelector = @selector(metodo);
La acción o target usaran esto, por ejemplo: [button addTarget:self action:metodo:)];


Un ejemplo practico del uso de Instrospection seria para los casos en que tenemos una aplicación universal, en otras palabras, una aplicación que se pueda utilizar en distintas versiones de iOS. En este caso tenemos el verificar si una pantalla es "Retina Display" o no. Antes de dibujar algo debemos saber si podemos utilizar el método contentScaleFactor que sirve para convertir puntos a pixeles en pantallas de alta resolución (recordemos que no son equivalentes en el iPhone4 por ejemplo). Si el dispositivo no soporta dicho método entonces colocaremos una equivalencia básica de 1 : 1.


- (void)drawRect:(CGRect)aRect 
{
   CGFloat scaleFactor = 1.0; 
   if ([self respondsToSelector:@selector(contentScaleFactor)])  //Si no responde al método no es Retina                                                    
    {
       scaleFactor = self.contentScaleFactor; // usa el scaleFactor
    }
}



Y allí esta la breve descripción de Introspection. Espero les sea de ayuda.

No hay comentarios:

Publicar un comentario