Categorie Objective-C

A volte, potresti scoprire di voler estendere una classe esistente aggiungendo comportamenti utili solo in determinate situazioni. Per aggiungere tale estensione alle classi esistenti, Objective-C forniscecategories e extensions.

Se è necessario aggiungere un metodo a una classe esistente, forse, per aggiungere funzionalità per rendere più facile fare qualcosa nella propria applicazione, il modo più semplice è usare una categoria.

La sintassi per dichiarare una categoria utilizza la parola chiave @interface, proprio come una descrizione di una classe Objective-C standard, ma non indica alcuna eredità da una sottoclasse. Invece, specifica il nome della categoria tra parentesi, in questo modo -

@interface ClassName (CategoryName)

@end

Caratteristiche della categoria

  • Una categoria può essere dichiarata per qualsiasi classe, anche se non si dispone del codice sorgente dell'implementazione originale.

  • Tutti i metodi dichiarati in una categoria saranno disponibili per tutte le istanze della classe originale, così come per tutte le sottoclassi della classe originale.

  • In fase di esecuzione, non c'è differenza tra un metodo aggiunto da una categoria e uno implementato dalla classe originale.

Diamo ora un'occhiata all'implementazione di una categoria di esempio. Aggiungiamo una categoria alla classe Cocoa NSString. Questa categoria ci consentirà di aggiungere un nuovo metodo getCopyRightString che ci aiuta a restituire la stringa del copyright. È mostrato di seguito.

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

Ora, quando compiliamo ed eseguiamo il programma, otterremo il seguente risultato.

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

Anche se tutti i metodi aggiunti da una categoria sono disponibili per tutte le istanze della classe e delle sue sottoclassi, dovrai importare il file di intestazione della categoria in qualsiasi file di codice sorgente in cui desideri utilizzare i metodi aggiuntivi, altrimenti ti imbatterai in avvisi ed errori del compilatore.

Nel nostro esempio, poiché abbiamo solo una singola classe, non abbiamo incluso alcun file di intestazione, in tal caso dovremmo includere i file di intestazione come detto sopra.