Objective-C-Protokolle

Mit Objective-C können Sie Protokolle definieren, die die Methoden deklarieren, die voraussichtlich für eine bestimmte Situation verwendet werden. Protokolle werden in den Klassen implementiert, die dem Protokoll entsprechen.

Ein einfaches Beispiel wäre eine Netzwerk-URL-Verarbeitungsklasse. Sie verfügt über ein Protokoll mit Methoden wie der processCompleted-Delegatenmethode, die die aufrufende Klasse anzeigt, sobald der Netzwerk-URL-Abrufvorgang abgeschlossen ist.

Eine Syntax des Protokolls ist unten gezeigt.

@protocol ProtocolName
@required
// list of required methods
@optional
// list of optional methods
@end

Die Methoden unter Schlüsselwort @required muss in den Klassen implementiert werden, die dem Protokoll und den Methoden unter entsprechen @optional Schlüsselwörter sind optional zu implementieren.

Hier ist die Syntax für eine Klasse, die dem Protokoll entspricht

@interface MyClass : NSObject <MyProtocol>
...
@end

Dies bedeutet, dass jede Instanz von MyClass nicht nur auf die speziell in der Schnittstelle deklarierten Methoden reagiert, sondern dass MyClass auch Implementierungen für die erforderlichen Methoden in MyProtocol bereitstellt. Es ist nicht erforderlich, die Protokollmethoden in der Klassenschnittstelle neu zu deklarieren - die Übernahme des Protokolls ist ausreichend.

Wenn Sie eine Klasse benötigen, um mehrere Protokolle zu übernehmen, können Sie diese als durch Kommas getrennte Liste angeben. Wir haben ein Delegatenobjekt, das die Referenz des aufrufenden Objekts enthält, das das Protokoll implementiert.

Ein Beispiel ist unten gezeigt.

#import <Foundation/Foundation.h>

@protocol PrintProtocolDelegate
- (void)processCompleted;

@end

@interface PrintClass :NSObject {
   id delegate;
}

- (void) printDetails;
- (void) setDelegate:(id)newDelegate;
@end

@implementation PrintClass
- (void)printDetails {
   NSLog(@"Printing Details");
   [delegate processCompleted];
}

- (void) setDelegate:(id)newDelegate {
   delegate = newDelegate;
}

@end

@interface SampleClass:NSObject<PrintProtocolDelegate>
- (void)startAction;

@end

@implementation SampleClass
- (void)startAction {
   PrintClass *printClass = [[PrintClass alloc]init];
   [printClass setDelegate:self];
   [printClass printDetails];
}

-(void)processCompleted {
   NSLog(@"Printing Process Completed");
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   SampleClass *sampleClass = [[SampleClass alloc]init];
   [sampleClass startAction];
   [pool drain];
   return 0;
}

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

2013-09-22 21:15:50.362 Protocols[275:303] Printing Details
2013-09-22 21:15:50.364 Protocols[275:303] Printing Process Completed

Im obigen Beispiel haben wir gesehen, wie die delgate-Methoden aufgerufen und ausgeführt werden. Es beginnt mit startAction. Sobald der Prozess abgeschlossen ist, wird die Delegatmethode processCompleted aufgerufen, um den Abschluss der Operation anzuzeigen.

In jeder iOS- oder Mac-App wird niemals ein Programm ohne Delegierten implementiert. Daher ist es wichtig, dass wir die Verwendung von Delegierten verstehen. Delegatenobjekte sollten den Eigenschaftstyp unsafe_unretained verwenden, um Speicherverluste zu vermeiden.