Las categorías son una de las características más útiles de Objective-C. En esencia, una categoría le permite añadir métodos a una clase existente, sin que la subclasificación o necesidad de conocer cualquiera de los detalles de cómo se implementa.
Una categoría recoge las implementaciones de método en archivos separados. El programador puede colocar grupos de métodos relacionados en una categoría para que sean más legibles. En otras palabras, si deseas agregar un método a todas las instancias de NSString en tu aplicación, solo hay añadir una nueva categoría. No hay necesidad de una subclase personalizada.
Por ejemplo, voy a añadir dos métodos para un NSString. uno para determinar si el contenido es una URL y la otra para añadir un método de reverseString.
Se vería así:
- Crear un nuevo proyecto de XCode un “Command Line Tool”. Lo llamaré ExtendsNSString

- A continuación, cree una nueva clase Objective-C (lo voy a llamar a NSString_Extend ). Elimine todo el código en el archivo de cabecera (NSString_Extend.h) y ponemos el siguiente código:
#import <Cocoa/Cocoa.h> @interface NSString (Extends) - (BOOL) isURL; - (NSString *)reverseString; @end
es muy similar a una declaración de clase. La diferencia es que no hay una súper clase, y hay un nombre para la categoría entre paréntesis, el nombre puede ser el que quieras.
- Ahora elimine todo el código en el archivo de implementación ( NSString_Extend.m) y ponemos el siguiente código:
#import "NSString_Extend.h" @implementation NSString (Extends) - (BOOL) isURL { if ( [self hasPrefix:@"http://"] ) return YES; else return NO; } - (NSString *) reverseString { NSUInteger len = [self length]; NSMutableString *rtr=[NSMutableString stringWithCapacity:len]; // unichar buf[1]; while (len > (NSUInteger)0) { unichar uch = [self characterAtIndex:--len]; [rtr appendString:[NSString stringWithCharacters:&uch length:1]]; } return rtr; } @endA diferencia de las subclases, las categorías no se puede agregar variables de instancia. Puede, sin embargo, utilizar categorías para sustituir métodos existentes en las clases, pero debes hacerlo con mucho cuidado.
- Ahora usted puede utilizar estos métodos en cualquier NSString, vamos a cambiar el main.m, que se verá algo como lo siguiente:
#import <Foundation/Foundation.h> #import "NSString_Extend.h" int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // insert code here... NSString* string1 = @"http://pixar.com/"; NSString* string2 = @"Pixar"; if ( [string1 isURL] ) NSLog (@"string1 is a URL"); else NSLog (@"string1 is not a URL"); if ( [string2 isURL] ) NSLog (@"string2 is a URL"); else NSLog (@"string2 is not a URL"); NSString *test = [@"!A string to be reverted!" reverseString]; NSLog(@"%@", test); [pool drain]; return 0; }Cuando se realizan cambios en una clase con una categoría, esta afecta a todas las instancias de esa clase en toda la aplicación.
Puedes descargar el codigo de este tutorial Aqui
Fuente:





