Convention de dénomination en Objective C / C, commencez par «_»?

Quelque chose que je vois ppl définit la variable comme ceci:

b2World *_world; b2Body *_body; CCSprite *_ball; 

au lieu de

 b2World *world; b2Body *body; CCSprite *ball; 

Je connais le second, mais pas le premier. Donc, j’ai vérifié la Wikipedia sur la convention de nommage:

Les noms commençant par un double soulignement ou un soulignement et une lettre majuscule sont réservés à la mise en œuvre (compilateur, bibliothèque standard) et ne doivent pas être utilisés (par exemple, __reserved ou _Reserved).

Alors, est-ce une signification particulière qui commence par “_”?

Le code que j’ai vu et qui utilise “_” pour commencer est ici:

http://www.raywenderlich.com/457/intro-to-box2d-with-cocos2d-tutorial-bouncing-balls

La page wiki.

Il existe une convention de longue date parmi certains développeurs Objective-C pour préfixer les variables d’instance avec un trait de soulignement. Cela peut être utile de plusieurs façons: premièrement, il est plus facile de repérer les variables d’instance dans un fichier .m; deuxièmement, cela évite aux développeurs de créer des noms de création pour les parameters de méthode afin d’éviter toute collision avec les noms de variables d’instance; et troisièmement, comme d’autres l’ont noté, cela indique que les variables d’instance sont privées et qu’elles ne devraient donc pas être consultées volontairement dans le code.

En fait, je plaiderais pour éviter d’accéder directement aux variables d’instance dans des méthodes autres que les accesseurs (getters et setters), -dealloc et -init... Cela ne veut pas dire que vous ne devriez jamais, jamais les utiliser nulle part ailleurs, mais vous devriez au moins y penser avant d’utiliser une variable d’instance directement dans d’autres méthodes.

C’est vraiment très utile, mais la plupart des gens ne savent pas pourquoi, et c’est dommage. Apple utilise des traits de soulignement pour séparer la manière dont d’autres objects accèdent aux variables d’un object particulier et la manière dont un object particulier accède à ses propres variables. Cela peut sembler un peu étrange, mais imaginez ce qui suit: Vous reconnaissez probablement tous l’avertissement du compilateur suivant

 .h @property (nonatomic, retain, readonly) UITableView *tableView; .m - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [self loadSomethingElseForTableView:tableView]; } 

Cela entraînera un avertissement pour le compilateur, car il ne sait pas si vous faites référence à la variable locale “tableView” ou à la variable d’instance. Par conséquent, Apple vous recommande d’append ce qui suit au début de votre @implémentation.

 @synthesize tableView = _tableView; 

Désormais, lorsque vous faites référence à _tableView , le compilateur sait que vous entendez la variable d’instance et non la variable locale.

En outre, cela facilite beaucoup la compréhension de la récupération de place dans Obj-C, et évite les erreurs courantes.

Par exemple, lorsque vous procédez comme suit:

 @property (nonatomic, retain, readonly) NSSsortingng *title; - (id)initWithTitle:(NSSsortingng *)title { if ((self = [super init])) { self.title = title; // Is not possible, since it's read only. title = title; // Is not possible, since it's the same (local) variable. // Changing the method to initWithTitle:(NSSsortingng *)aTitle; title = aTitle; } return self; } 

Maintenant, puisque vous n’utilisez pas le setter par défaut (en fait, vous ne pouvez pas, car c’est en lecture seule), vous devez conserver la variable vous-même. C’est beaucoup plus facile à retenir lorsque vous atsortingbuez un préfixe à chaque variable d’instance (vous savez donc que vous devez le conserver vous-même).

Donc, fondamentalement, il est important de comprendre la différence entre self.variable et ( _ ) variable . (c’est-à-dire: self.variable mappe sur [self setVariable:...] et la variable mappe directement sur votre pointeur.

De plus, quand vous l’ajoutez en tant que variable privée, comme ceci:

 @interface TSSomeObject : NSObject { @private NSSsortingng *_privateTitle; } @end 

Le préfixe de soulignement n’est pas vraiment nécessaire, sauf si vous pouvez rencontrer des variables locales portant le même nom. En plus de cela, encore une fois, c’est aussi un moyen facile de vous rappeler que c’est un pointeur local et que vous devez conserver (et libérer) la variable lorsque vous l’atsortingbuez à votre object.

Ce qui ne va pas, c’est créer une propriété avec un préfixe de soulignement, comme ceci:

 @property (nonatomic, retain) NSSsortingng *_title; 

C’est vraiment faux, et je ne vais même pas expliquer pourquoi;)


Donc oui! Vous devriez vraiment utiliser les préfixes de soulignement, cela rend votre code beaucoup plus facile à lire et à interpréter par le compilateur! Dans Xcode 4, Apple a même ajouté ces @synthesize aux modèles par défaut.

Habituellement, ils sont utilisés pour les variables qui ne doivent pas être accessibles en dehors du fichier / module / espace de nom / quel que soit l’élément en cours, dans des langues qui ne permettent pas de restreindre l’access avec quelque chose comme un mot clé private

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html#//apple_ref/doc/uid/20001284-1001757

Par convention et par recommandation dans le document ci-dessus, vous devez préfixer ivars par un trait de soulignement.

Certes, il s’agit de définir explicitement des ivars pour les propriétés.

Mais l’utilisation est la même, pour indiquer l’utilisation d’un ivar partout où il est vu.

Je suis cependant ouvert à la possibilité que, dans ce contexte, l’utilisation d’un ivar avec un préfixe de soulignement puisse indiquer à l’utilisateur qu’il fait quelque chose de mal. Pendant ce temps, un trait de soulignement postfixé pourrait être utilisé pour les ivars purs destinés à être consultés directement.

Ce blog contient les bonnes idées d’un praticien expérimenté et il recommande l’utilisation de traits de soulignement préfixés.

http://blog.bignerdranch.com/463-a-motivation-for-ivar-decorations/

Que vous choisissiez d’utiliser des traits de soulignement préfixés pour décorer vos propres ivars, il existe au moins certaines preuves que certaines décorations vous aideront à éviter les insectes. Et les tirets bas sont la décoration la plus courante.

Apple réserve des noms commençant par un trait de soulignement pour ses propres méthodes et ivars privés. Dans Objective-C sur n’importe quelle plate-forme Apple, il est recommandé de ne pas préfixer vos identifiants d’un trait de soulignement.

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html