@property : utilisation de copy, retain, assign, getter et setter
Petit tour sur les @property et sur l’utilisation de son deuxième paramètre qui accepte les valeurs suivantes : copy, retain, assign, getter et setter.
Tout d’abord, écrivons la déclaration d’une classe que nous appellerons Product :
@interface Product : NSObject { NSString *name; NSString *nickname; BOOL ready; Product *product; NSString *_enable; } // Les 5 property que nous allons voir ci-dessous @property(nonatomic, copy) NSString* name; @property(nonatomic, retain) Product* product; @property(nonatomic, assign) NSString* nickname; @property(nonatomic, getter=isReady) BOOL ready; @property(nonatomic, copy) NSString* enable; @end
Dans la définition de notre class Product, nous utilisons la directive @synthesize afin que les getter et les setter soient générés au moment de la compilation de façon automatique, cela évite bien évidemment d’avoir à les écrire soi-même !
@implementation Product @synthesize name, nickname, product, ready, enable=_enable; @end
Getter/Setter pour @property(nonatomic, copy) NSString* name
-(NSString*) name { return name; } -(void) setName:(NSString*) aName { if(name != aName) { [name release]; name = [aName copy]; // car copy dans le @property } }
Note : dans la méthode dealloc , il faut faire un release de name.
Getter/Setter pour @property(nonatomic,retain) Product* product
-(Product*) product { return product; } -(void) setProduct:(Product*) aProduct { if (product != aProduct) { [product release]; product = [aProduct retain]; // car retain dans le @property } }
Note : dans la méthode dealloc , il faut faire un release de product.
Getter/Setter pour @property(nonatomic, assign) NSString* nickname
-(NSString*) nickname { return nickname; } -(void) setNickname:(NSString*)aNickname { nickname = aNickname; }
Getter/Setter pour @property(nonatomic,getter=isReady) BOOL ready
-(BOOL) isReady // le getter n'est pas "ready" mais bien "isReady" { return ready; } -(void) setReady:(BOOL)newReady { ready = newReady; }
Note : « setter » fonctionne de la même façon que « getter ».
Getter/Setter pour @property(nonatomic, copy) NSString* enable
-(NSString*) enable { return _enable; // car dans le @synthesize on a mis enable = _enable } -(void) setEnable:(NSString*)newEnable { if (_enable != newEnable) { [_enable release]; _enable = [newEnable copy]; } }