Technique du tiret-bas @property

KveenKveen Membre
Bonjour,

J'aimerais avoir des précisions sur une technique que je trouve souvent mais dont je n'ai pas trouvé l'explication dans mes livres...

C'est le tiret-bas qui permet sans doute de respecter un peu plus l'encapsulation, je me trompe ?

Ici avec iOS mais je pense que la technique s'applique un peu partout.

Dans le fichier d'interface :

@interface CustomButton : UIButton<br />{<br />&nbsp; &nbsp; UIView *_inputView;&nbsp; &nbsp; <br />}<br /><br />@property (nonatomic, retain) UIView *inputView;


Dans le fichier d'implémentation :

@implementation CustomButton<br /><br />@synthesize inputView = _inputView;


Merci pour vos éclaircissements.

Réponses

  • BunoBuno Membre
    23:22 modifié #2
    Hello,
    C'est juste une convention de nommage pour distinguer les ivars.
    En C++, par exemple, on utilise couramment la notation suivante:
    <br />int m_monInt;<br />
    
  • KveenKveen Membre
    avril 2011 modifié #3
    Ah d'accord, donc ça n'a pas vraiment une utilité spécifique à  part s'y retrouver plus facilement.

    Et finalement on n'est plus obligé de déclarer l'ivar dans l'interface, le nouveau runtime le fait automatiquement  ?

    Est-ce que ce serait très différent de faire inputView = qqchose et self.inputView = qqchose ?

    Merci.
  • cyranocyrano Membre
    23:22 modifié #4
    voila tu as mis le doigt dessus  :D

    tu touveras les reponses seul, je pense  ;)
  • 23:22 modifié #5
    C'est plutôt i_monInt ... pour le "i" de iVar.
  • DrakenDraken Membre
    23:22 modifié #6
    J'utilises m_monInt.. m comme member. Un vieux réflexe hérité du c#.

  • 23:22 modifié #7
    Aaaah ces ancêtres alors... :p
  • zoczoc Membre
    avril 2011 modifié #8
    dans 1302255360:

    Est-ce que ce serait très différent de faire inputView = qqchose et self.inputView = qqchose ?

    Le comportement des 2 affectations est très différent, dans la mesure ou self.inputView = x appelle en fait le setter setInputView, alors que inputView = x affecte directement la variable...

    Si en plus la propriété a l'attribut "retain" alors courcircuiter le setter mènera fort probablement à  des fuites mémoires.

    Ceci dit, préfixer une variable par un caractère de soulignement, c'est normalement réservé à  Apple (d'après les coding guidelines), on n'est pas sensé l'utiliser (même si beaucoup de monde le fait).
  • KveenKveen Membre
    avril 2011 modifié #9
    Si en plus la propriété a l'attribut "retain" alors courcircuiter le setter mènera fort probablement à  des fuites mémoires.


    Ok merci, je comprends mieux.

    Par contre, je suis étonné de voir que dans tous les exemples de code iOS les développeurs prennent la peine de déclarer leurs ivars dans l'interface en plus de @property, c'est une ligne de code en plus pour pas grand chose, nan ?

    @interface CustomButton : UIButton<br />{<br />&nbsp;  <br />}<br /><br />@property (nonatomic, retain) UIView *inputView;
    


    Ce serait aussi bien comme ça...
  • zoczoc Membre
    23:22 modifié #10
    Sans doute parce que le "modern runtime" qui permet de ne pas déclarer les variables d'instances associées aux propriétés n'est disponible qu'à  partir d'iOS 4, et que donc pour iOS 3 il est obligatoire de déclarer la variable.

  • KveenKveen Membre
    23:22 modifié #11
    Oups !  :o

    Disons que je n'ai connu que iOS 4 en tant que développeur du moins... et on pourrait même dire Xcode 4 :o
  • CéroceCéroce Membre, Modérateur
    23:22 modifié #12
    Quand on ne déclare pas la variable, on ne peut pas voir sa valeur au débogueur.
Connectez-vous ou Inscrivez-vous pour répondre.