Objective-C de la propriété et de synthétiser logique
Qu'est ce qu'un nom de variable d'instance, disons, topSpeed, comme les conférences de l'Université de Stanford sur l'Objective-C et de développement iOS?
Voici le code:
@property (nonatomic) double topSpeed;
En regardant ce code, je pense que je l'ai défini une variable topSpeed dans la classe.
Je ne comprends pas pourquoi elle déclare automatiquement la méthode de lecture avec le nom de le même que le nom de la variable - topSpeed?
Une autre question est de savoir quand nous utilisons
@synthesize topSpeed = _topSpeed
Et si nous regardons ce que le @synthétiser va générer:
- (double) setTopSpeed:(double)speed
{
_topSpeed = speed;
}
- (double) topSpeed
{
return _topSpeed;
}
Qu'est-ce que _topSpeed ici et qu'est-ce que topSpeed? J'ai déclaré une variable topSpeed, pas la _topSpeed. Que faire si je ne suis pas d'utilisation de la propriété, ce qui serait le nom de la variable?
OriginalL'auteur maximus | 2012-03-03
Vous devez vous connecter pour publier un commentaire.
Dans les premiers jours de l'Obj-C et encore aujourd'hui, vous les variables déclarées dans votre classe d'en-tête du fichier comme ceci:
Ensuite, vous devez créer manuellement setter et getter méthodes pour accéder à la variable en dehors de votre classe. Afin de les aider à faire face à la gestion de la mémoire (utile pour les objets), Apple a introduit les propriétés en Obj-C 2.0 et il vous a permis de définir des accesseurs pour une variable donnée. On pourrait dire qu'une variable aurait certains attributs (tels que le maintien ou la copie d'une valeur, d'autres setter ou getter nom, etc) et que vous avez défini comme:
puis dans votre @mise en œuvre vous pourriez @la synthèse de ces propriétés avec les attributs et le compilateur de générer setter et getter méthodes pour votre variable.
Maintenant, aujourd'hui, l'idée est que vous pouvez déplacer loin de mettre en œuvre les variables d'instance dans le {} de la section et il suffit de déclarer une propriété et d'une synthèse. Ce que nous obtenons si nous nous contentons de dire
est un setter et getter appelé setTopSpeed: et topSpeed avec une variable d'instance appelée topSpeed (créé par le compilateur) pour stocker la valeur. L'idée derrière
@synthesize topSpeed = _topSpeed;
est que la variable d'instance nom sera_topSpeed
mais l'accesseur noms seront toujours-setTopSpeed:
et-topSpeed
. Cela aide pour la lisibilité du code, car il peut y avoir confusion entre le moment de vous dire de soi.topSpeed ou topSpeed dans votre code (le premier appelle l'accesseur la deuxième est la ivar). Le _topSpeed se différencie de variables normales et aussi rend explicite lorsque vous êtes à l'appel de l'auto.topSpeed (l'accesseur) vs _topSpeed (ivar). Apple est en mouvement à ce trait de soulignement de la syntaxe ainsi donc ne pense pas que ça va disparaître, parce que c'est tout le contraire. Mise à jour: (Voir Tommy commentaire)Il contribue également à la variable conflits de noms. Si vous aviez à mettre en œuvre setTopSpeed: vous-même, il ressemblerait à quelque chose comme ceci:
@synthesize topSpeed = _topSpeed
est implicite par les@property
; il n'y a pas besoin en fait de l'inclure. Vous pouvez inclure une alternative@synthesize
(par exemple, pour spécifier une variable d'instance nom sans un trait de soulignement ou juste complètement étrangers à la propriété) ou d'écrire les getter/setter vous-même (par exemple, si vous voulez l'appeler, dire,[self setNeedsLayout]
lors de la modification de la propriété), mais si vous avez d'approvisionnement rien, alors le compilateur déduit l'habitude@synthesize
.l'auto.topSpeed ou topSpeed dans votre code (qui sont 2 choses différentes) Sont ces deux choses différentes car
topSpeed
est l'instance de variable dont la valeur est retournée par laself.topSpeed
propriété?J'ai mis à jour cette ligne. Devrait être clair maintenant.
Je n'ai pas l'obtenir, même si ce n'est pas un bien et c'est une variable d'instance. Ne peut-on pas définir et à obtenir la valeur de la variable d'instance? Je veux dire, COMMENT sommes-nous alors la configuration et l'obtention de la valeur de la variable d'instance?
Si vous déclarez la variable d'instance dans la mise en œuvre (.m), alors vous n'avez accès qu'à l'intérieur de cette classe. Si vous souhaitez rendre accessible au public, alors vous auriez besoin de faire une propriété dans l'interface.h).
OriginalL'auteur
@synthesize topSpeed = _topSpeed
signifie que Vous voulez une variable nommée _topSpeed et a Accesseurs nommé topSpeed et setTopSpeed.@property (nonatomic) double topSpeed;
est pas une pure déclaration de variable, Il sera également déclarer les Accesseurs trop. Un pur variable d'une classe Foo ressemblera à ceci :@interface Foo:NSObject{
double topSpeed;
}
@public
.OriginalL'auteur
Pour la première question, la réponse est "convention de nommage". Donc, il est seulement une convention de nommage. Si vous souhaitez accéder à la
topSpeed
variable, le "get" la partie n'est pas significative - comme[car topSpeed]
est plus facile à lire que[car getTopSpeed]
. Quant à la seconde question, je ne suis pas sûr mais je crois que vous avez accès à latopSpeed
propriété par le biais de la variable_topSpeed
.OriginalL'auteur