Variable de Classe et propriété

JekarJekar Membre
11:14 modifié dans API AppKit #1
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

Réponses

  • Philippe49Philippe49 Membre
    novembre 2008 modifié #2
    The Objective-C Programming Language

    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.

    dans 1225556820:

    C est quoi la subtilité avec read-only, retain etc.... ?

    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
  • JekarJekar Membre
    11:14 modifié #3
    Ok, mais en readonly comment donner une valeur a cette propriété???

    Et donc il est possible d avoir une proprité qui n'est pas définit comme variable de classe?
  • Philippe49Philippe49 Membre
    novembre 2008 modifié #4
    dans 1225559577:

    Ok, mais en readonly comment donner une valeur a cette propriété???

    On peut l'initialiser sans passer par le setter.
    property=[[ClassA alloc] init]; etc...

    dans 1225559577:

    Et donc il est possible d avoir une proprité qui n'est pas définit comme variable de classe?

    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.
  • psychoh13psychoh13 Mothership Developer Membre
    11:14 modifié #5
    SI, il est possible d'avoir une @property qui n'est associée à  aucune variable d'instance.

    Par exemple :
    <br />// Person.h<br />@interface Person : NSObject<br />{<br />&nbsp; &nbsp; NSString *firstName;<br />&nbsp; &nbsp; NSString *lastName;<br />}<br />@property(copy) NSString *firstName, *lastName;<br />@property(readonly) NSString *fullName;<br />@end<br /><br />// Person.m<br />@implementation Person<br />@synthesize firstName, lastName;<br /><br />- (NSString *)fullName<br />{<br />&nbsp; &nbsp; return [NSString stringWithFormat:@&quot;%@ %@&quot;, firstName, lastName];<br />}
    


    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 :
    <br />// Person.h<br />@interface Person : NSObject<br />@property(copy) NSString *firstName, *lastName;<br />@property(readonly) NSString *fullName;<br />@end<br /><br />// Person.m<br />@implementation Person<br />@synthesize firstName, lastName;<br /><br />- (NSString *)fullName<br />{<br />&nbsp; &nbsp; return [NSString stringWithFormat:@&quot;%@ %@&quot;, self.firstName, self.lastName];<br />}
    
  • Philippe49Philippe49 Membre
    11:14 modifié #6
    Dans ce cas, la property est (logiquement) refusée en @synthesize. Ce  que tu signales correspond en fait au KVC qui ne demande que d'avoir des setter ou getter pour fonctionner. Le @property est toléré par le compilateur mais quelle serait son utilité ?
  • psychoh13psychoh13 Mothership Developer Membre
    11:14 modifié #7
    Le property n'est pas "toléré", le property permet de ne pas avoir à  écrire les déclarations des méthodes et à  donner des informations à  l'utilisateur de la classe.
    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 :
    @property(getter=isPlayable) BOOL playable;<br />if(obj.playable)<br />obj.playable = NO;<br /><br />if([obj isPlayable])<br />[obj setPlayable: NO];
    
  • Philippe49Philippe49 Membre
    11:14 modifié #8
    Certes, on sait bien tout cela, mais si on ne déclare pas de variable correspondante comme dans ton exemple fullName, le @property sert à  quoi ? à  part une belle présentation pour la doc d'Apple qui évite d'écrire deux méthodes à  la place d'une property ... 
    Dans ce cas c'est bien toléré car cela ne correspond plus à  rien au niveau de la compilation.
  • psychoh13psychoh13 Mothership Developer Membre
    11:14 modifié #9
    Bah, ça permet de différencier les propriétés des autres méthodes, comme par exemple init.
  • Philippe49Philippe49 Membre
    11:14 modifié #10
    Oui cela devient une présentation de code. Dans le genre, il y a pas mal d'exemples d'Apple qui définissent une property, puis @synthesize, et qui redéfinissent le setter ... 
  • JekarJekar Membre
    11:14 modifié #11
    Si on definit le setter, pas besoin de faire un @synthetize, c est bien ca?
  • psychoh13psychoh13 Mothership Developer Membre
    11:14 modifié #12
    @synthesize générera les méthodes manquantes, celles que tu n'as pas définies, donc si tu définis le setter il générera seulement le getter.
  • Philippe49Philippe49 Membre
    11:14 modifié #13
    dans 1226069835:

    Si on definit le setter, pas besoin de faire un @synthetize, c est bien ca?


    soit
    @synthesize laProperty;
    -(void) setLaproperty:... {
    }


    ou bien (en mode readwrite)
    @dynamic laProperty;
    -(...)laProperty{

    }
    -(void) setLaProperty:... {
    ...
    }


  • MalaMala Membre, Modérateur
    11:14 modifié #14
    Mince j'avais pas vu le nouvau fil de discussion!  :o

    Bon bein je m'y colle. C'est ma tournée!
    :p :p :p :p :p
Connectez-vous ou Inscrivez-vous pour répondre.