2010-07-18 5 views
2

Je suis l'exemple du modèle Navigation View avec des données de base dans le dernier SDK iOS.Quelqu'un peut-il expliquer cette syntaxe @synthesize?

Dans le fichier rootViewController.m Je vois cela dans la ligne de @synthesize:

@synthesize fetchedResultsController=fetchedResultsController_, managedObjectContext=managedObjectContext_; 

Lorsque le fichier d'en-tête est:

@private 
NSFetchedResultsController *fetchedResultsController_; 
NSManagedObjectContext *managedObjectContext_; 

}

@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController; 

Est-ce que cela signifie qu'ils sont tous les deux @synthésized (créant des getters & setters) mais alors on est régler pour égaler l'autre? Il semble également que fetchedResultsController est également une méthode dans le fichier rootViewController.m.

Ce modèle a changé dans cette version SDK, je suis le livre Apress Plus de développement iPhone 3 et cela a vraiment confondu les choses.

Répondre

-1

Seul le premier (sur les lhs de l'instruction synthesize) est synthétisé avec un getter et un setter et devient la variable d'instance "public".

Ce dernier (avec le trait de soulignement) est toujours disponible dans l'instance mais n'est pas exposé en dehors de l'instance. Ils se réfèrent tous les deux à la même adresse mémoire.

+0

Ok, c'est logique, alors est-ce que je comprends aussi que l'instance publique appelle aussi une méthode du même nom quand elle est chargée? Cela semble très étrange, surtout pour un exemple d'application de la documentation Apple! Je n'ai aucune idée de ce qui appelle la méthode fetchedResultsController. – JMWhittaker

3

Dans la syntaxe @synthesize, le côté gauche du =(qui est juste un caractère synthétisent utilise pour cette syntaxe, pas l'opérateur d'affectation) est le nom de la propriété (et méthodes associées) et Le côté droit du = est la variable d'instance à utiliser pour la propriété nommée.

Dans l'exemple ci-dessus, @synthesize fetchedResultsController=fetchedResultsController_ crée un getter fetchedResultsController et un setFetchedResultsController: méthode setter, à la fois en utilisant la variable d'instance fetchedResultsController_ pour le stockage.

De même, @synthesize managedObjectContext=managedObjectContext_ crée managedObjectContext et setManagedObjectContext: méthodes accesseurs, à la fois soutenu par la variable d'instance managedObjectContext_.

Si les « côté droit » n'a pas été explicitement spécifiée (si la déclaration lue @synthesize fetchedResultsController, managedObjectContext;), la synthèse aurait pris le même nom pour la variable d'instance comme la propriété. Certains programmeurs Objective-C n'aiment pas le laisser à ce comportement par défaut car il peut être facile de faire l'erreur d'avoir l'intention de définir une variable de fonction-portée locale et de définir une variable d'instance à la place. L'utilisation d'un trait de soulignement pour toutes les variables d'instance rend leur intention plus claire.Pour être clair, plusieurs propriétés @synthesize peuvent être combinées en une par séparation de virgule;

chacun est toujours sa propre déclaration telle que ci-dessus est totalement équivalent à: sera créé automatiquement si pas explicitement défini

@synthesize fetchedResultsController=fetchedResultsController_; 
@synthesize managedObjectContext=managedObjectContext_; 

rien aussi vaut, dans les nouveaux des variables versions Xcode/iOS exemple, et les déclarations de @synthesize sont également supposées si non spécifié. Ces différences sont expliquées dans la référence rapide Objective-C Feature Availability Index d'Apple.