Objective-C-Erweiterungen

Eine Klassenerweiterung weist eine gewisse Ähnlichkeit mit einer Kategorie auf, kann jedoch nur einer Klasse hinzugefügt werden, für die Sie zur Kompilierungszeit über den Quellcode verfügen (die Klasse wird gleichzeitig mit der Klassenerweiterung kompiliert).

Die von einer Klassenerweiterung deklarierten Methoden werden im Implementierungsblock für die ursprüngliche Klasse implementiert, sodass Sie beispielsweise keine Klassenerweiterung für eine Framework-Klasse wie eine Cocoa- oder Cocoa Touch-Klasse wie NSString deklarieren können.

Erweiterungen sind eigentlich Kategorien ohne den Kategorienamen. Es wird oft als bezeichnetanonymous categories.

Die Syntax zum Deklarieren einer Erweiterung verwendet das Schlüsselwort @interface, genau wie eine Standardbeschreibung der Objective-C-Klasse, zeigt jedoch keine Vererbung von einer Unterklasse an. Stattdessen werden nur Klammern hinzugefügt, wie unten gezeigt -

@interface ClassName ()

@end

Eigenschaften von Erweiterungen

  • Eine Erweiterung kann nicht für eine Klasse deklariert werden, sondern nur für die Klassen, für die wir ursprünglich den Quellcode implementiert haben.

  • Eine Erweiterung fügt private Methoden und private Variablen hinzu, die nur für die Klasse spezifisch sind.

  • Jede in den Erweiterungen deklarierte Methode oder Variable ist selbst für die geerbten Klassen nicht zugänglich.

Erweiterungsbeispiel

Erstellen wir eine Klasse SampleClass mit einer Erweiterung. Lassen Sie uns in der Erweiterung eine private Variable internalID haben.

Lassen Sie uns dann eine Methode getExternalID verwenden, die die externalID nach der Verarbeitung der internalID zurückgibt.

Das Beispiel ist unten gezeigt und dies funktioniert nicht mit dem Online-Compiler.

#import <Foundation/Foundation.h>

@interface SampleClass : NSObject {
   NSString *name;
}

- (void)setInternalID;
- (NSString *)getExternalID;

@end

@interface SampleClass() {
   NSString *internalID;
}

@end

@implementation SampleClass

- (void)setInternalID {
   internalID = [NSString stringWithFormat: 
   @"UNIQUEINTERNALKEY%dUNIQUEINTERNALKEY",arc4random()%100];
}

- (NSString *)getExternalID {
   return [internalID stringByReplacingOccurrencesOfString: 
   @"UNIQUEINTERNALKEY" withString:@""];
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   SampleClass *sampleClass = [[SampleClass alloc]init];
   [sampleClass setInternalID];
   NSLog(@"ExternalID: %@",[sampleClass getExternalID]);        
   [pool drain];
   return 0;
}

Wenn wir nun das Programm kompilieren und ausführen, erhalten wir das folgende Ergebnis.

2013-09-22 21:18:31.754 Extensions[331:303] ExternalID: 51

Im obigen Beispiel sehen wir, dass die interne ID nicht direkt zurückgegeben wird. Wir entfernen hier den UNIQUEINTERNALKEY und stellen nur den verbleibenden Wert der Methode getExternalID zur Verfügung.

Das obige Beispiel verwendet nur eine Zeichenfolgenoperation, kann jedoch viele Funktionen wie Verschlüsselung / Entschlüsselung usw. enthalten.