Les deux syntaxes servent des objectifs différents.
une catégorie nommée - @interface Foo (FooCategory) - est généralement utilisé pour:
(1) étendre une classe existante en ajoutant des fonctionnalités. Exemple: NSAttributedString dans Foundation est étendu par une catégorie dans AppKit qui ajoute une API de mise en forme de texte semblable à RTF spécifique à AppKit. (2) déclarer un ensemble de méthodes qui pourraient ou non être mises en œuvre par un délégué. Exemple: Différentes classes déclarent - mais n'implémentent pas - @interface NSObject (SetODelegateMethods).
Le formulaire (2) n'a plus la cote depuis que @protocol a été étendu pour prendre en charge les méthodes @optional dans Objective-C 2.0.
Une extension de classe - @interface Foo() - est conçue pour vous permettre de déclarer une API privée supplémentaire - SPI ou System Programming Interface - qui est utilisée pour implémenter les entrailles de la classe. Cela apparaît généralement en haut du fichier .m. Toutes les méthodes/propriétés déclarées dans l'extension de classe doivent être implémentées dans @implementation, tout comme les méthodes/propriétés trouvées dans l'interface @ public.
Les extensions de classe peuvent également être utilisées pour redéclarer une propriété @ readonly publique comme readwrite avant de @ synthétiser les accesseurs.
Exemple:
.h
@interface Foo:NSObject
@property(readonly, copy) NSString *bar;
-(void) publicSaucing;
@end
Foo.m
@interface Foo()
@property(readwrite, copy) NSString *bar;
- (void) superSecretInternalSaucing;
@end
@implementation Foo
@synthesize bar;
.... must implement the two methods or compiler will warn ....
@end
La barre @synthesize n'est-elle pas utilisée? ligne signifie que le compilateur va générer les deux méthodes (getter et setter) pour la barre? – Elliot
Oui, mais seul le getter est déclaré dans l'en-tête public, le setter est déclaré en privé pour être utilisé dans la classe elle-même. Ce n'est pas C++, si vous voulez introspecter l'exécution, vous pouvez trouver que le setter est là et l'appeler où vous voulez, mais à moins que vous le fassiez explicitement, vous obtiendrez des avertissements si vous essayez de définir la propriété. –
@Louis est correct. La deuxième propriété remplace celle "readonly" dans la propriété de fichier .h en spécifiant "readwrite", c'est donc ce que le compilateur fait réellement. Cependant, seul le getter est visible pour les personnes, y compris le fichier d'en-tête, car quand ils importent le fichier, ils ne voient que la version "readonly" de la propriété. –