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;