@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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@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 !
1 2 3 4 5 |
@implementation Product
@synthesize name, nickname, product, ready, enable=_enable;
@end |
Getter/Setter pour @property(nonatomic, copy) NSString* name
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-(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
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-(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
1 2 3 4 5 6 7 8 9 |
-(NSString*) nickname
{
return nickname;
}
-(void) setNickname:(NSString*)aNickname
{
nickname = aNickname;
} |
Getter/Setter pour @property(nonatomic,getter=isReady) BOOL ready
1 2 3 4 5 6 7 8 |
-(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
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-(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];
}
} |
Aucun commentaire pour l'instant