Denken Sie daran, dass ein Protokoll der kompilierten App keinen Code hinzufügt. Es erzwingt nur die Tatsache, dass Ihre Klasse die Methoden implementieren muss, um als "konform" mit dem Protokoll zu gelten. Eine gute Verwendung davon wäre, eine Gruppe von Klassen mit derselben Funktionsweise zu generieren: <printable>oder <serialized>usw. Sie könnten also ein <plays>Protokoll erstellen , zum Beispiel:
@protocol plays
- (void) play;
- (NSString *) type;
@end
Und dann muss eine Klasse, die konform ist, <plays>die Methoden playund implementieren type. Ist dies nicht der Fall, gibt der Compiler eine Warnung aus, kompiliert die Klasse jedoch trotzdem. In Ihrem Code prüfen Sie, ob ein Objekt einem Protokoll mit dem folgenden Code entspricht:
if ([obj conformsTo: @protocol(plays)]) {
[obj play];
}
Eine Kategorie fügt Ihrer Klasse dynamisch neue Methoden hinzu. Diese Methoden sind für die Laufzeit als Selektoren global zugänglich und können wie in @selector(foo)und namentlich aufgerufen werden[object foo:bar];
Der Zweck einer Kategorie besteht darin, einer Klasse speziellen neuen Code hinzuzufügen, auch wenn Sie nicht über den Quellcode für diese Klasse verfügen. Möglicherweise treten Sicherheitsprobleme auf, und Sie können Speicherlecks in Klassen usw. verursachen.
In Ihrem Fall vielleicht in einer separaten Datei AVAudioPlayerDelegate_TrackOps.m
#import "AVAudioPlayerDelegate.h"
@implementation AVAudioPlayerDelegate (TrackOps)
- (NSObject *) foo {
return bar;
}
@end
Wenn Sie es als Kategorie NSObjectfestlegen, reagieren alle Klassen darauf foo. Fookann auch eine eigenständige Methode sein Objc_perform_selector(@selector(foo)).
Fazit: Verwenden Sie eine Kategorie, um einer Klasse eine schnelle Methode hinzuzufügen, Protokolle zum Erzwingen von Methodenimplementierungen und Unterklassen, um vorhandene Klassen zu spezialisieren (z. B. Hinzufügen von Mitgliedsvariablen oder wichtige neue Funktionen). Kategorien können auch verwendet werden, um eine oder zwei Methoden zu überschreiben, wenn eine Unterklasse nicht benötigt und gewünscht wird. Wenn Sie jedoch einer Klasse Funktionen hinzufügen möchten, erstellen Sie normalerweise eine Unterklasse. Weitere Beispiele, Ideen und andere allgemeine Informationen zu diesem Thema finden Sie in der Apple-Einführung zu Objective-C