Rappelez-vous qu'un protocole n'ajoute aucun code à l'application compilée - il ne fait qu'imposer le fait que votre classe doit implémenter les méthodes pour être considérée comme "conforme" au protocole. Une bonne utilisation de ce protocole serait de générer un groupe de classes ayant toutes le même mode de fonctionnement : <printable>
o <serialized>
etc. Vous pourriez donc créer un <plays>
par exemple :
@protocol plays
- (void) play;
- (NSString *) type;
@end
Et ensuite une classe qui se conforme à <plays>
DOIT mettre en œuvre le play
y type
méthodes. Si ce n'est pas le cas, le compilateur émet un avertissement mais compile quand même la classe. Dans votre code, vous vérifiez si un objet se conforme à un protocole avec le code suivant :
if ([obj conformsTo: @protocol(plays)]) {
[obj play];
}
Une catégorie ajoute en fait de nouvelles méthodes de façon dynamique à votre classe. Ces méthodes sont globalement accessibles au runtime comme des sélecteurs et peuvent être appelées par leur nom comme dans @selector(foo)
y [object foo:bar];
Le but d'une catégorie est d'ajouter un nouveau code spécial à une classe même si vous n'avez pas le code source de cette classe. Il peut y avoir des problèmes de sécurité et vous pourriez créer des fuites de mémoire dans les classes, etc.
Dans votre cas peut-être, dans un fichier séparé AVAudioPlayerDelegate_TrackOps.m
#import "AVAudioPlayerDelegate.h"
@implementation AVAudioPlayerDelegate (TrackOps)
- (NSObject *) foo {
// do foo stuff;
return bar;
}
@end
En le plaçant dans une catégorie de NSObject
fait que toutes les classes répondent à foo
. Foo
peut être une méthode autonome Objc_perform_selector(@selector(foo))
également.
Bottom Line : utiliser une catégorie pour ajouter une méthode rapide à une classe, des protocoles pour faire respecter les implémentations de méthodes, et des sous-classes pour spécifier les méthodes. l'implémentation des méthodes, et des sous-classes pour spécialiser des classes existantes (comme l'ajout de variables membres ou de nouvelles fonctionnalités majeures). Les catégories peuvent également être utilisées pour remplacer une méthode ou deux lorsqu'une sous-classe n'est pas nécessaire ou souhaitée, mais généralement, si vous voulez ajouter une fonctionnalité à une classe, vous créez une sous-classe. Pour plus d'exemples, d'idées, et d'autres informations générales sur ce sujet, il y a toujours la page Introduction d'Apple à Objective-C