Variable de Classe et propriété
Jekar
Membre
J'ai donc du mal a comprendre les propriétés de classe.
Pourquoi créer une propriété et pas une variable de classe?
C est quoi la subtilité avec read-only, retain etc.... ?
Les variables de classe on y a acces avec self.mavariable, les propriétés aussi?
Quand on ne les "synthétise pas" il faut nous même créer les get et set sauf pour un readonly c est bien ca?
Merci
Pourquoi créer une propriété et pas une variable de classe?
C est quoi la subtilité avec read-only, retain etc.... ?
Les variables de classe on y a acces avec self.mavariable, les propriétés aussi?
Quand on ne les "synthétise pas" il faut nous même créer les get et set sauf pour un readonly c est bien ca?
Merci
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
The Objective-C “declared properties†feature provides a simple way to declare and implement an object's accessor methods.
You can think of a property declaration as being equivalent to declaring two accessor methods. Thus, for example, @property float value; is equivalent to:
- (float)value;
- (void)setValue:(float)newValue;
A property declaration, however, provides additional information about how the accessor methods are implemented (as described in “Property Declaration Attributesâ€).
Effectivement, prendre appui sur les properties permet d'utiliser des accesseurs "clés en main", compatible en théorie avec un bon traitement de la mémoire, du Key Value Coding et de ce qui en découlent.
Exemple : @property ClassA * property;
Lors de l'affectation de value à property , différents choix sont possibles
• On veut voir effectuer une copie de value : property =[value copy] ; ==> @property (copy) ClassA* property
• On veut le classique : if(property!=value) { [property release]; property =[value retain];} ==> @property (retain) ClassA* property
• On veut simplement une affectation :    property=value; ==> @property (assign) ClassA* property
On peut également ne pas avoir de setter pour la property, c'est le sens de readonly
Et donc il est possible d avoir une proprité qui n'est pas définit comme variable de classe?
On peut l'initialiser sans passer par le setter.
property=[[ClassA alloc] init]; etc...
On dit variable d'instance et non variable de classe.
variable d'instance : chaque instance possède un exemplaire
variable de classe : un seul exemplaire possédé par la classe , non prévu directement par Obj-C ( mais on peut souvent trafiquer)
Non, il n'est pas possible d avoir une propriété qui n'est pas définie comme variable.
Par exemple :
Il n'est pas non plus nécessaire que la propriété soit readonly.
Et même, dans le runtime 64 bits, on n'a même pas besoin de mettre les ivars :
Par exemple :
Le @synthesize n'est qu'une des 3 techniques pour implémenter les accesseurs.
@synthesize génère la totalité du code pour accéder en utilisé les attributs des propriété, ensuite, tu as la définition des méthodes directement, come je l'ai fait pour -fullName, qui permet donc de créer une propriété avec un code spécifique.
Et enfin tu as le @dynamic qui permet d'indiquer au compilateur que la méthode sera donnée pendant le runtime ou dans une category séparée.
@property se base sur KVC.
Quand tu fais une @property, tu as le choix entre la notation avec point, ou avec la méthode directement...
Exemple :
Dans ce cas c'est bien toléré car cela ne correspond plus à rien au niveau de la compilation.
soit
@synthesize laProperty;
-(void) setLaproperty:... {
}
ou bien (en mode readwrite)
@dynamic laProperty;
-(...)laProperty{
}
-(void) setLaProperty:... {
...
}
Bon bein je m'y colle. C'est ma tournée!