Catégories Objective-C

Parfois, vous pouvez trouver que vous souhaitez étendre une classe existante en ajoutant un comportement qui n'est utile que dans certaines situations. Afin d'ajouter une telle extension aux classes existantes, Objective-C fournitcategories et extensions.

Si vous avez besoin d'ajouter une méthode à une classe existante, peut-être, pour ajouter des fonctionnalités afin de faciliter la tâche dans votre propre application, le moyen le plus simple est d'utiliser une catégorie.

La syntaxe pour déclarer une catégorie utilise le mot-clé @interface, tout comme une description de classe Objective-C standard, mais n'indique aucun héritage d'une sous-classe. Au lieu de cela, il spécifie le nom de la catégorie entre parenthèses, comme ceci -

@interface ClassName (CategoryName)

@end

Caractéristiques de la catégorie

  • Une catégorie peut être déclarée pour n'importe quelle classe, même si vous ne disposez pas du code source d'implémentation d'origine.

  • Toutes les méthodes que vous déclarez dans une catégorie seront disponibles pour toutes les instances de la classe d'origine, ainsi que pour toutes les sous-classes de la classe d'origine.

  • Au moment de l'exécution, il n'y a aucune différence entre une méthode ajoutée par une catégorie et une méthode implémentée par la classe d'origine.

Voyons maintenant un exemple d'implémentation de catégorie. Ajoutons une catégorie à la classe Cocoa NSString. Cette catégorie nous permettra d'ajouter une nouvelle méthode getCopyRightString qui nous aide à renvoyer la chaîne de copyright. Il est montré ci-dessous.

#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;
}

Maintenant, lorsque nous compilons et exécutons le programme, nous obtiendrons le résultat suivant.

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

Même si toutes les méthodes ajoutées par une catégorie sont disponibles pour toutes les instances de la classe et de ses sous-classes, vous devrez importer le fichier d'en-tête de catégorie dans n'importe quel fichier de code source où vous souhaitez utiliser les méthodes supplémentaires, sinon vous rencontrerez avertissements et erreurs du compilateur.

Dans notre exemple, comme nous n'avons qu'une seule classe, nous n'avons inclus aucun fichier d'en-tête, dans ce cas, nous devrions inclure les fichiers d'en-tête comme indiqué ci-dessus.