J'ai vu le morceau de code suivant:
//example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;
//example.m
@synthesize mapView = mapView1
Quelle est la relation entre mapView
et mapView1
? Crée-t-il une méthode set
et get
pour mapView1
?
iphone
objective-c
Hoang Duy Nam
la source
la source
Réponses:
Dans votre exemple,
mapView1
est une variable d'instance (ivar), un élément de stockage mémoire qui appartient à une instance de la classe définie dansexample.h
etexample.m
.mapView
est le nom d'une propriété . Les propriétés sont les attributs d'un objet qui peut être lu ou défini en utilisant la notation de points:myObject.mapView
. Une propriété ne doit pas nécessairement être basée sur un ivar, mais la plupart des propriétés le sont. La@property
déclaration indique simplement au monde qu'il existe une propriété appeléemapView
.@synthesize mapView = mapView1;
Cette ligne indique au compilateur de créer un setter et un getter pour
mapView
, et qu'il doit utiliser l'ivar appelémapView1
. Sans le= mapView1
partie, le compilateur supposerait que la propriété et ivar ont le même nom. (Dans ce cas, cela produirait une erreur de compilation, car aucun ivar n'est appelémapView
.)Le résultat de cette
@synthesize
instruction est similaire à si vous aviez ajouté ce code vous-même:Si vous ajoutez vous-même ce code à la classe, vous pouvez remplacer le
@synthesize
instruction par@dynamic mapView;
L'essentiel est d'avoir une distinction conceptuelle très claire entre les ivars et les propriétés. Ce sont vraiment deux concepts très différents.
la source
@synthesize
crée un getter et un setter pour la variable.Cela vous permet de spécifier certains attributs pour vos variables et lorsque vous attribuez
@synthesize
cette propriété à la variable, vous générez le getter et le setter pour la variable.Le nom de la propriété peut être le même que le nom de la variable. Parfois, les gens veulent qu'il soit différent afin de l'utiliser dans
init
oudealloc
ou lorsque le paramètre est passé avec le même nom de variable.la source
De la documentation :
la source
Comme je viens de rencontrer ce problème lors de l'édition du code hérité, je veux prendre des notes supplémentaires sur les réponses existantes dont il faut être conscient.
Même avec une version plus récente du compilateur, cela fait parfois une différence si vous l'omettez
@synthesize propertyName
ou non .Dans le cas où vous déclarez une variable d'instance sans trait de soulignement tout en la synthétisant, par exemple:
Entête:
La mise en oeuvre:
self.someInt
accédera à la même variable quesomeInt
. Ne pas utiliser de trait de soulignement pour ivars ne suit pas les conventions de dénomination, mais je suis juste entré dans une situation où j'ai dû lire et modifier ce code.Mais si vous pensez maintenant "Hé, @synthesize n'est plus important car nous utilisons un compilateur plus récent" vous vous trompez! Votre classe se traduira alors par deux ivars , à savoir
someInt
plus une_someInt
variable autogénérée . Ainsiself.someInt
etsomeInt
ne traitera plus les mêmes variables. Si vous ne vous attendez pas à un tel comportement comme je l'ai fait, cela pourrait vous donner mal à la tête.la source
@synchronize
est une directive pour savoir comment synchroniser les threads lors de l'accès à la propriété et@synthesize
pour lier la propriété à une variable d'instance via des getters et des setters.Autosynthesized property 'someInt' will use synthesized instance variable '_someInt', not existing instance variable 'someInt'
. (Je ne sais pas dans quelle version de xcode cet avertissement a été ajouté.)Selon la documentation Apple, @Synthesize est utilisé uniquement pour renommer les variables d'instance. Par exemple
Maintenant, dans la classe, vous ne pouvez pas utiliser
_str
car la ligne ci-dessus a renommé la variable d'instance enstr2
@property
permet aux objets d'être utilisés par des objets dans d'autres classes, ou en d'autres termes rend l'objet public.la source
Lorsque vous créez une propriété dans @interface, cette propriété sera automatiquement rétablie par une variable d'instance nommée _propertyName. Ainsi, lorsque vous créez une propriété nommée firstName, le compilateur derrière la scène créera une variable d'instance nommée _firstName par défaut. Le compilateur créera également la méthode getter et setter pour vous (c'est-à-dire firstName, setFirstName).
Maintenant, lorsque vous synthétisez la propriété par @synthesize firstName, vous dites simplement au compilateur de renommer ma variable d'instance (_firstName) par firstName. Si vous souhaitez renommer votre variable d'instance sauvegardée avec un nom différent, vous pouvez simplement attribuer un nom différent tout en synthétisant le nom de la propriété (c'est-à-dire @synthesize firstName = myFirstName), en faisant cela, votre propriété est sauvegardée par une variable d'instance nommée myFirstname.
Donc, en bref, la plupart du temps, @synthesize sert à renommer votre variable d'instance sauvegardée par votre propriété.
la source
Voir la documentation Apple
Fondamentalement, la synthèse crée une méthode setMapView et mapView qui définit et obtient mapView1
la source
Il crée un getter et un setter pour votre objet. Vous pouvez accéder avec quelque chose comme ceci:
ou
mapView1 est le nom de l'ivar dans la classe, mapView est le nom de la ou des méthodes getter / setter.
la source