36 votes

Que fait @synthesize window=_window ?

Je comprends que @synthesize window; combiné avec @property crée automatiquement vos setters et getters, mais je ne sais pas exactement ce qui se passe lorsque vous attribuez une valeur telle que

 @synthesize searchBar = _searchBar;

Cela signifie-t-il que je peux simplement utiliser _searchBar dans mes méthodes plutôt que de dire self.searchBar ?

Est-ce pour éviter un conflit de noms d'ivar par exemple avec cette méthode de délégation :

- (void) searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText

Est-ce l'équivalent de self.searchBar plutôt que searchBar ou ces deux-là sont-ils identiques de toute façon ?

32voto

kubi Points 20607

Vos propriétés ont presque toujours une variable d'accompagnement. Ce que

@synthesize searchBar = _searchBar;

déclare que la variable d'arrière-plan pour votre barre de recherche sera appelée _searchBar . Cela vous permet de découpler le nom de la propriété du nom de votre variable. En fait, si vous n'utilisez pas @synthesize vous n'avez pas besoin d'avoir une variable d'accompagnement du tout.

Quant à pourquoi Les gens font ça, chacun a des raisons différentes. Personnellement, je le fais pour

  1. éviter les conflits avec les noms de variables et
  2. préciser quand j'utilise une variable locale et quand j'utilise une variable d'instance.

18voto

mmalc Points 7663

La syntaxe est décrite dans la documentation -- voir Directives de mise en œuvre des biens .

La raison du changement du nom de la variable d'instance est précisément de décourager l'accès direct. Un trait de soulignement est utilisé par convention. (Remarque : Bien que le Directives de codage mettent actuellement en garde contre l'utilisation d'un trait de soulignement, ce conseil est dépassé).

Toujours selon la documentation (voir Utilisation des méthodes accesseurs ), en dehors des méthodes init et dealloc, vous devez toujours utiliser des méthodes d'accès. Vous utilisez les accesseurs set pour vous assurer que vous gérez correctement la mémoire et que vous émettez des notifications de changement KVO si nécessaire. Vous utilisez les accesseurs get pour vous assurer que la propriété est correctement initialisée. Il existe plusieurs endroits où les propriétés sont initialisées paresseusement ; si vous n'utilisez pas l'accesseur, vous obtenez nil...

Un exemple d'accès direct : En utilisant l'un des modèles de données de base, si vous avez utilisé :

NSFetchRequest *request = ...;
NSError *error = nil;

NSArray *results = [__managedObjectContext executeFetchRequest:request error:&error];

au lieu de

NSArray *results = [self.managedObjectContext executeFetchRequest:request error:&error];

alors -- parce que le contexte de l'objet géré est créé paresseusement dans la méthode de l'accesseur -- vous pourriez finir par envoyer un message à nil et n'obtenir aucun résultat.

17voto

hotpaw2 Points 40796
@synthesize searchBar = _searchBar;

dit de créer une méthode getter nommée "searchBar" (etc.) pour la variable d'instance _searchBar.

Le trait de soulignement sur la variable _searchBar signifie généralement "Ne m'accédez pas directement, sauf si vous vraiment savoir ce que vous faites. Veuillez utiliser les méthodes getter et setter à la place !".

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