Dans le mauvais vieux temps avant Objective-C 2.0, il était courant d'écrire des getters et setters pour vos variables d'instance, par exemple.
@interface Foo : NSObject
{
@private
id foo;
}
-(void) setFoo: (id) newFoo;
-(id) foo;
@end
@implementation Foo
// need dealloc to release foo too.
-(void) setFoo: (id) newFoo
{
[newFoo retain];
[foo release];
foo = newFoo;
}
-(id) foo
{
return foo;
}
@end
Et c'est juste dans l'environnement à un seul thread. Il y avait encore plus de choses nécessaires pour les applications multithread.
Les propriétés fournissent un raccourci soigné pour ce qui précède. Le @property remplace les deux déclarations dans l'interface et donne à l'appelant de meilleurs indices sur la sémantique du getter et du setter. Il vous permet également de @synthesize les accesseurs de sorte que le compilateur va générer le code pour eux automatiquement (vous n'avez pas avoir pour les @synthesize, vous pouvez fournir vos propres implémentations si vous le souhaitez). Toutes ces peuvent être remplacés par
@interface Foo : NSObject
{
@private
id foo;
}
@property (nonatomic, retain) id foo;
@end
@implementation Foo
// need dealloc to release foo too.
@synthesize foo;
@end
Cela permet d'économiser beaucoup de taper, mais aussi vous pouvez voir à partir de l'interface qui setFoo: conservera sa nouvelle valeur et que la propriété n'est pas sûr à utiliser (pour définir ou get) dans un environnement multithread (sans autre mécanisme de verrouillage).