Objective-C synthesize nom de la propriété remplaçant
Je suis en train d'essayer de comprendre le but de la synthesize
directive avec le nom de la propriété primordial. Dire que j'ai une interface définie comme suit:
@interface Dummy ... {
UILabel *_dummyLabel;
}
@property (retain, nonatomic) UILabel *dummyLabel;
Et dans la mise en œuvre du dossier, j'ai:
@synthesize dummyLabel = _dummyLabel;
De ce que je comprends, "dummyLabel" est juste un alias de la variable d'instance "_dummyLabel". Quelle est la différence entre le soi._dummyLabel et l'auto.dummyLabel?
source d'informationauteur Thomas
Vous devez vous connecter pour publier un commentaire.
Oui.
self._dummyLabel
est pas défini, cependant_dummyLabel
ne l'est pas.La syntaxe à point étend à de simples appels de méthode, il n'est donc pas spécifique aux propriétés. Si vous avez une méthode appelée
-(id)someObject
par exemple dans le cas deobject.someObject
il sera comme si que vous avez écrit[object someObject];
.Votre compréhension est erronée.
dummyLabel
est le nom de la propriété, et est pas un alias de la variable d'instance de la variable d'instance est seulement appelé_dummyLabel
. Donc la suite est titulaire d'une instance deDummy
appelémyObject
:[myObject dummyLabel]
œuvresmyObject.dummyLabel
œuvres[myObject _dummyLabel]
échouemyObject._dummyLabel
échouemyObject->dummyLabel
échouemyObject->_dummyLabel
dépend de la visibilité de la ivar (@public
@private
@protected
)[myObject valueForKey: @"dummyLabel"]
œuvres[myObject valueForKey: @"_dummyLabel"]
dépend de la mise en œuvre de+accessInstanceVariablesDirectly
(c'est à dire de travail par défaut dans le cas où+accessInstanceVariablesDirectly
retourneYES
).Je ne suis pas en mesure de trouver un "commentaire" sur le bouton, donc je vais avoir à la poste comme une "réponse".
Voulais juste développer sur Andre commentaire - en sachant quand vous êtes à l'aide de la synthèse des propriétés vs la vanille variable, vous savez (notamment en cas de setters) lorsqu'une variable est conservée, copié, publié automatiquement grâce à votre belle setter, vs manipulés par la main.
Bien sûr, si vous faites les choses, vous n'avez probablement pas besoin de l'aide d'un setter pour conserver/release correctement les objets! Mais il y a peut être d'autres scénarios où vous référant à votre ivars comme
self.ivar
au lieu de_ivar
peut être utile, par exemple lorsque vous êtes en utilisant des setters/getters au lieu de la valeur par défaut synthétisés. Peut-être chaque fois que vous modifiez une propriété, vous aussi vous voulez de les stocker dans NSUserDefaults. Alors vous pourriez avoir un peu de code comme ceci:Note: Ceci est juste l'illustration de code, il peut y avoir mille et une choses de mal avec elle!
Donc maintenant, dans votre code, si vous avez une ligne qui dit
_autoLoginOn = YES
- vous savez, il ne va pas être enregistré à NSUserDefaults, tandis que si vous utilisezself.autoLoginOn = YES
vous savez exactement ce qui va arriver.La différence entre
_autoLoginOn
etself.autoLoginOn
est plus que juste de la sémantique.Dans certains ObjC runtimes vous avez de la difficulté à effectuer les variables d'instance invisible pour les utilisateurs de la classe. Pour planter certains préfixe ou suffixe) sur les variables d'instance peut rendre clair (ou plus claire) que vous ne voulez pas que quiconque de jouer avec vos variables. Cependant, vous ne voulez pas que la crasse sur vos fonctions publiques. Cela vous permet d'obtenir.
Il pourrait également être utile si vous avez besoin pour maintenir une vieille interface avec un ensemble de noms en même temps qu'un nouvel ensemble d'Api avec une nouvelle série de noms (setLastname vs setSurname).
Vieux post, mais je pense qu'il est important de mentionner, qu'il est recommandé d'accéder à des variables via les accesseurs et mutateurs (donc, avec la notation point). L'accès à un champ directement (_ivar) est fortement recommandé que lors de l'initialisation.
Il y a du bon l'article d'Apple:
https://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html
Dernier paragraphe: