Categorías de Objective-C

A veces, es posible que desee ampliar una clase existente agregando un comportamiento que solo es útil en determinadas situaciones. Para agregar dicha extensión a las clases existentes, Objective-C proporcionacategories y extensions.

Si necesita agregar un método a una clase existente, tal vez, para agregar funcionalidad para que sea más fácil hacer algo en su propia aplicación, la forma más fácil es usar una categoría.

La sintaxis para declarar una categoría utiliza la palabra clave @interface, al igual que una descripción de clase estándar de Objective-C, pero no indica ninguna herencia de una subclase. En cambio, especifica el nombre de la categoría entre paréntesis, así:

@interface ClassName (CategoryName)

@end

Características de la categoría

  • Se puede declarar una categoría para cualquier clase, incluso si no tiene el código fuente de implementación original.

  • Cualquier método que declare en una categoría estará disponible para todas las instancias de la clase original, así como para las subclases de la clase original.

  • En tiempo de ejecución, no hay diferencia entre un método agregado por una categoría y uno implementado por la clase original.

Ahora, veamos una implementación de categoría de muestra. Agreguemos una categoría a la clase Cocoa NSString. Esta categoría nos permitirá agregar un nuevo método getCopyRightString que nos ayuda a devolver la cadena de derechos de autor. Se muestra a continuación.

#import <Foundation/Foundation.h>

@interface NSString(MyAdditions)
+(NSString *)getCopyRightString;
@end

@implementation NSString(MyAdditions)

+(NSString *)getCopyRightString {
   return @"Copyright TutorialsPoint.com 2013";
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   NSString *copyrightString = [NSString getCopyRightString];
   NSLog(@"Accessing Category: %@",copyrightString);
   
   [pool drain];
   return 0;
}

Ahora, cuando compilemos y ejecutemos el programa, obtendremos el siguiente resultado.

2013-09-22 21:19:12.125 Categories[340:303] Accessing Category: Copyright TutorialsPoint.com 2013

Aunque los métodos agregados por una categoría están disponibles para todas las instancias de la clase y sus subclases, deberá importar el archivo de encabezado de categoría en cualquier archivo de código fuente donde desee utilizar los métodos adicionales; de lo contrario, se encontrará con advertencias y errores del compilador.

En nuestro ejemplo, dado que solo tenemos una clase única, no hemos incluido ningún archivo de encabezado, en tal caso deberíamos incluir los archivos de encabezado como se dijo anteriormente.