Objective-C : les fondamentaux pour le développement iOS 6 Objective-C : les propriétés
On a vu que les variables d'instance d'une classe ne sont pas accessibles par les autres objets. La classe doit déclarer des accesseurs pour les variables d'instance qu'elle veut partager.
Le langage met à la disposition du développeur un mécanisme simplifiant l'écriture des accesseurs: les propriétés. Une propriété est une variable d'instance pour laquelle des accesseurs sont définis.
Déclarer une propriété
On déclare les propriétés dans l'interface de la classe, au même endroit que les méthodes (en effet, les accesseurs sont des méthodes) :
@interface MaClasse : NSObject
@property(nonatomic,strong) NSString *myName;
@end
Cet exemple de code est équivalent à celui-ci :
@interface MaClasse : NSObject {
NSString *myName;
}
- (NSString*) myName;
- (void) setMyName:(NSString*) myName;
@end
ATTENTION Les propriétés ne sont que du sucre syntaxique
La notion de propriété en Objective-C est du sucre syntaxique, c'est-à-dire une aide que le compilateur apporte au développeur en lui évitant de taper du code répétitif.
Implémenter les accesseurs
Vous pouvez choisir de programmer vous-même les accesseurs dans l'implémentation de votre classe ou demander au compilateur de le faire pour vous à l'aide du mot-clé @synthesize.
@implementation MaClasse
@synthesize myName;
// équivalent à
- (NSString*) myName
{
}
- (void) setMyName:(NSString*)newName
{
myName = newName;
}
@end
Attributs des propriétés
Il est possible de fournir au compilateur des indications sur la propriété pour changer le code produit.
/
/ Propriété en lecture seule
@property (readonly) NSString *string;
// Propriété en mode non-atomic
@property (nonatomic) NSString *string;
// L'objet affecté à cette propriété doit être retenu
@property (retain) NSString *string;
// Propriété en mode non-atomic et objet devant être retenu
@property (nonatomic, retain) NSString *string;
// Propriété en mode non-atomic et objet ne devant pas être retenu
@property (nonatomic, weak) NSString *string;
// Propriété en mode non-atomic et étant gérée par l'ARC
// Automatic Reference Counting
@property (nonatomic, strong) NSString *string; 1
1 Le dernier exemple est le cas le plus fréquent. Nous détaillerons un peu plus loin la gestion de la mémoire en Objective-C et le mot-clé strong.
ASTUCE L'attribut nonatomic
Par défaut, le code produit pour les propriétés est construit pour être appelable depuis plusieurs threads en même temps. Pour cela, un mécanisme de synchronisation est mis en place automatiquement autour des accès aux propriétés.
Dans la plupart des cas, ce mécanisme n'est pas utile, et le plus souvent vous déclarerez vos propriétés avec l'attribut nonatomic, ce qui améliore les performances.
La notation point
La notation point allège l'appel des accesseurs (les accesseurs peuvent avoir été déclarés manuellement ou à l'aide du mot-clé @property). Ainsi, si un objet a des accesseurs pour une propriété color, on peut y faire référence de plusieurs manières.
Accès à une propriété via les accesseurs
UIColor *c = [objet color]
[objet setColor: c];
Accès à une propriété via la notation point
UIColor *c = objet.color;
objet.color = c;