Posts Tagged ‘ retain

@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];
}
}