153 votes

Que fait exactement @synthesize?

J'ai vu le morceau de code suivant:

 //example.h
MKMapView * mapView1;
@property (nonatomic, retain) MKMapView * mapView;

//example.m
@synthesize mapView = mapView1
 

Question: Quelle est la relation entre mapView et mapView1 ? Est-ce qu'il crée une méthode set et get pour mapView1 ?

Merci !

231voto

Felixyz Points 10705

Dans votre exemple, mapView1 est une variable d'instance (ivar), un morceau de la mémoire de stockage qui appartient à une instance de la classe définies en example.h et example.m. mapView est le nom d'une propriété. Les propriétés sont les attributs d'un objet qui peut être lu ou fixé à l'aide de la notation par points: myObject.mapView. Un bien ne pas avoir à être basé sur un ivar, mais la plupart des propriétés sont. L' @propertydéclaration dit au monde qu'il existe une propriété appelée mapView.

@synthesize mapView = mapView1;

Cette ligne indique au compilateur de créer un setter et getter pour mapView, et qu'ils devraient utiliser les ivar appelés mapView1. Sans l' = mapView1 partie, le compilateur suppose que la propriété et ivar ont le même nom. (Dans ce cas, ce serait de produire une erreur du compilateur, car il n'y a pas de ivar appelés mapView.)

Le résultat de cette @synthesize déclaration est similaire à si vous aviez ajouté ce code vous-même:

-(MKMapView *)mapView
{
   return mapView1;
}

-(void)setMapView:(MKMapView *)newMapView
{
  if (newMapView != mapView1)
  {
    [mapView1 release];
    mapView1 = [newMapView retain];
  }
}

Si vous ajoutez ce code à la classe vous-même, vous pouvez remplacer l' @synthesize déclaration avec

@dynamic mapView;

La chose principale est d'avoir une très nette distinction conceptuelle entre ivars et les propriétés. Ils sont vraiment deux très différents concepts.

31voto

vodkhang Points 11222

@synthesize crée un getter et un setter pour la variable.

Cela vous permet de spécifier des attributs pour vos variables et lorsque vous @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 identique au nom de la variable. Parfois, les gens veulent qu'il soit différent pour l'utiliser en init ou dealloc ou lorsque le paramètre est transmis avec le même nom de variable.

17voto

Dave DeLong Points 156978

De la documentation :

Vous utilisez le mot clé @synthesize pour indiquer au compilateur qu'il doit synthétiser les méthodes setter et / ou getter pour la propriété si vous ne les fournissez pas dans le bloc @implementation.

10voto

Lars Blumberg Points 1530

Comme je viens de rencontrer ce genre de problème lors de l'édition du code legacy je veux faire des remarques complémentaires à l'existant répond à un besoin d'être conscient de.

Même avec une nouvelle version de compilateur, il le fait parfois faire une différence si vous omettez @synthesize propertyName ou pas.

Dans le cas où vous déclarez une variable d'instance, sans trait de soulignement tout en encore la synchronisation, tels que:

En-tête:

@interface SomeClass : NSObject {
   int someInt;
}
@property int someInt;
@end

Mise en œuvre:

@implementation SomeClass
@synchronize someInt;
@end

self.someInt auront accès à la même variable que someInt. Pas à l'aide d'un trait de soulignement pour ivars ne suit pas les conventions de nommage, mais je venais d'arriver dans une situation où j'ai dû lire et modifier ce code.

Mais maintenant, si vous pensez que "Hey, @synchroniser n'est pas plus importants que nous utilisons un nouveau compilateur" vous vous trompez! Votre classe sera ensuite conduire à avoir deux ivars, à savoir l' someInt plus un générée automatiquement _someInt variable. Ainsi, self.someInt et someInt ne porteront pas sur les mêmes variables. Si vous n'avez pas s'attendre à un tel comportement que je n'ai cela peut vous obtenir certains des maux de tête pour le savoir.

7voto

Bhupesh Pruthi Points 48

Conformément à la documentation d'apple https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html

@Synthétiser est uniquement utilisé pour renommer les variables d'instance. Par exemple

@property NSString *str;

@synthétiser str = str2; Maintenant dans la classe que vous ne pouvez pas utiliser _str que la ligne ci-dessus a renomme la variable d'instance à str2. @property permet aux objets d'être utilisée par des objets dans d'autres classes. Ou, en d'autres mots fait l'objet public.

S'il vous plaît corrigez-moi si je me trompe.. Merci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X