J'ai vu dans quelques exemples iPhone que les attributs ont utilisé un trait de soulignement _ devant la variable. Quelqu'un sait-il ce que cela signifie? Ou comment ça marche?
Un fichier d'interface que j'utilise ressemble à:
@interface MissionCell : UITableViewCell {
Mission *_mission;
UILabel *_missionName;
}
@property (nonatomic, retain) UILabel *missionName;
- (Mission *)mission;
Je ne sais pas exactement ce que fait ce qui précède, mais lorsque j'essaie de définir le nom de la mission comme:
aMission.missionName = missionName;
J'obtiens l'erreur:
demande de membre 'missionName' dans quelque chose qui n'est pas une structure ou un syndicat
property
dans le fichier .h et dans l'accès .m je l'aide FIEself
comme si,self.someProperty
. Est-ce la bonne manière? Ou devrais-je utiliser les ivars dans le code?C'est juste une convention pour la lisibilité, cela ne fait rien de spécial au compilateur. Vous verrez des gens l'utiliser sur des variables d'instance privées et des noms de méthodes. Apple recommande en fait de ne pas utiliser le trait de soulignement (si vous ne faites pas attention, vous pouvez remplacer quelque chose dans votre superclasse), mais vous ne devriez pas vous sentir mal à l'idée d'ignorer ce conseil. :)
la source
Le seul objectif utile que j'ai vu est de faire la différence entre les variables locales et les variables membres comme indiqué ci-dessus, mais ce n'est pas une convention nécessaire. Lorsqu'il est associé à un @property, il augmente la verbosité des instructions de synthèse -
@synthesize missionName = _missionName;
et est moche partout.Au lieu d'utiliser le trait de soulignement, utilisez simplement des noms de variables descriptifs dans des méthodes qui ne sont pas en conflit. Lorsqu'elles doivent entrer en conflit, le nom de la variable dans la méthode doit subir un trait de soulignement, pas la variable membre qui peut être utilisée par plusieurs méthodes . Le seul endroit commun où cela est utile est dans un setter ou dans une méthode init. De plus, cela rendra l'instruction @synthesize plus concise.
Edit: Avec la dernière fonctionnalité du compilateur d'auto-synthèse, j'utilise maintenant le soulignement pour l'ivar (dans les rares occasions où j'ai besoin d'utiliser un ivar pour correspondre à ce que fait l'auto-synthèse.
la source
Cela ne veut vraiment rien dire, c'est juste une convention que certaines personnes utilisent pour différencier les variables membres des variables locales.
En ce qui concerne l'erreur, il semble qu'uneMission ait le mauvais type. Qu'est-ce que c'est sa déclaration?
la source
C'est uniquement pour la convention de dénomination des propriétés de synthèse.
Lorsque vous synthétisez des variables dans le fichier .m, Xcode vous fournira automatiquement _variable intelligence.
la source
Avoir un trait de soulignement permet non seulement de résoudre vos ivars sans recourir à la syntaxe self.member, mais cela rend votre code plus lisible puisque vous savez quand une variable est un ivar (à cause de son préfixe de soulignement) ou un argument membre (pas de trait de soulignement ).
Exemple:
la source
self.image
, qui accède à la propriété. Le seul moment où vous devez accéder à la variable d'instance,,_image
est directement dans lesinit
méthodes et ladealloc
méthode, lorsque l'appel de toute autre méthode peut être risqué (puisque l'objet est à moitié initialisé ou à moitié désalloué).Cela semble être l'élément «maître» pour les questions sur self.variableName par rapport à _variablename. Ce qui m'a jeté pour une boucle, c'est que dans le .h, j'avais:
Cela conduit à self.variableName et _variableName étant deux variables distinctes dans le .m. Ce dont j'avais besoin était:
Ensuite, dans la classe '.m, self.variableName et _variableName sont équivalents.
Ce que je ne suis toujours pas clair, c'est pourquoi de nombreux exemples fonctionnent encore, même si cela n'est pas fait.
Rayon
la source
au lieu du trait de soulignement, vous pouvez utiliser le nom self.variable ou vous pouvez synthétiser la variable pour utiliser la variable ou la sortie sans trait de soulignement.
la source
Il manque dans les autres réponses que l'utilisation
_variable
vous empêche de tapervariable
et d'accéder par inadvertance à l'ivar plutôt qu'à la propriété (présumée prévue).Le compilateur vous obligera à utiliser soit
self.variable
ou_variable
. L'utilisation de traits de soulignement rend la saisie impossiblevariable
, ce qui réduit les erreurs du programmeur.la source