Il est courant d'ajouter un @interface
qui définit une catégorie contenant des méthodes privées :
Personne.h :
@interface Person
{
NSString *_name;
}
@property(readwrite, copy) NSString *name;
-(NSString*)makeSmallTalkWith:(Person*)person;
@end
Personne.m :
@interface Person () //Not specifying a name for the category makes compiler checks that these methods are implemented.
-(void)startThinkOfWhatToHaveForDinner;
@end
@implementation Person
@synthesize name = _name;
-(NSString*)makeSmallTalkWith:(Person*)person
{
[self startThinkOfWhatToHaveForDinner];
return @"How's your day?";
}
-(void)startThinkOfWhatToHaveForDinner
{
}
@end
La "catégorie privée" (le nom approprié pour une catégorie sans nom n'est pas "catégorie privée", mais "extension de classe") .m empêche le compilateur de signaler que les méthodes sont définies. Cependant, étant donné que l'extension @interface
dans le fichier .m est une catégorie, vous ne pouvez pas y définir des ivars.
Mise à jour du 6 août 12 : Objective-C a évolué depuis la rédaction de cette réponse :
-
ivars
peut être déclarée dans une extension de classe (et a toujours pu l'être - la réponse était incorrecte)
-
@synthesize
n'est pas nécessaire
-
ivars
peuvent désormais être déclarés entre accolades au début de la section @implementation
:
c'est-à-dire,
@implementation {
id _ivarInImplmentation;
}
//methods
@end