web-dev-qa-db-fra.com

Besoin d'explication sur @ property / @ synthesize dans iOS

Pas un noob complet, je suis tout à fait nouveau dans la programmation iOS et dans Ojbective-C. Je viens principalement d'un milieu de C (DSP, microcontrôleurs), Delphi XE2/Pascal, Visual Basic et Java (bureau et Android)).

J'ai principalement appris Cocoa avec le livre "Beginning iOS 5 Development", d'Apress.

Récemment, j'ai regardé des vidéos de la WWDC 2012 et j'ai parcouru certains de leurs exemples de code, et je dois dire que je suis confus quant à la bonne façon d'écrire mes applications et plus précisément avec les mots @ property/@ synthesize.

Dans le livre, la plupart (pour ne pas dire tous) de l'exemple de code utilise pour définir une propriété comme par exemple

ViewController.h
@property (strong, nonatomic) NSMutableArray *list;

ViewController.m
@synthesize list;

puis toute la liste de synthèse d'accès au code avec

self.list

ou même simplement

list

Maintenant, dans chaque exemple de code WWDC que j'ai lu, je vois que les programmeurs définissent une propriété mais ensuite, dans le fichier .m, ils font des choses comme

@synthesize list = _list;

et accéder parfois

self.list

ou

_list

Je suis confus. Quelle est la bonne pratique? Comme Apple utilisent tous le soulignement, je pense que je devrais le faire de cette façon, mais pourquoi le livre ne l’a pas fait? Y a-t-il une différence entre list et _list? Et plus encore, car je suis dans le même objet pourquoi parfois utiliser self.list et parfois list/_list.

Parfois, ils n'utilisent pas @synthesize, je suppose que c'est quand ils veulent réécrire leurs propres accesseurs et mutateurs (ce qui n'est jamais mon cas jusqu'à présent).

J'ai lu ça et là sur le web mais rien n'était suffisamment clair pour me remettre en question, alors je compte sur StackOverflow pour apporter de la lumière ici.

Enfin, je préfère et réponds en fonction des meilleures pratiques/programmation actuelles d'iOS 6. Inutile de me dire comment le faire correctement dans les anciens iOS.

31
HpTerm

Il n'y a pas de bonne façon. Il n'y a que votre style préféré.

Les derniers compilateurs font une synthèse implicite sur la déclaration de propriété.

@synthesize list = _list;.

Rien n'est jamais écrit dans votre code. Ça arrive juste.

Cependant, cela ne vous empêche pas de le faire explicitement.

@synthesize list = somethingelse;

Ainsi, lorsque vous demandez un pointeur vers list via l'accesseur (self.list) vous obtiendrez un pointeur sur somethingelse

Dans la plupart des cas NSMutableArray *thing = self.list est équivalent à NSMutableArray *thing = somethingelse

Et juste parce que Apple utilise un style ne signifie pas que vous devez le faire. Chaque entreprise a généralement son propre style de codage.

Le principal problème avec l'utilisation de @synthesize list; est que cela pose le risque que vous puissiez écrire

self.list = thing ou list = thing.

Le premier utilise le _ setList: accesseur alors que ce dernier ne le fait pas et met le risque de bugs liés dans votre code, bien que ce ne soit pas aussi mauvais avec ARC que vous n'obtenez pas de fuites pour les propriétés strong.

Quel que soit le style que vous utilisez, gardez-le cohérent et soyez conscient des effets de l'utilisation directe d'un ivar list = thing par rapport à l'utilisation de son accesseur self.list = thing

31
Warren Burton

Il s'agit d'une fonctionnalité linguistique qui a vu son utilisation évoluer rapidement au cours des dernières années, ce qui explique les différentes formes. Avec les outils les plus récents, vous pouvez choisir d'ignorer @synthesize et que les choses fonctionnent raisonnablement.

Le comportement par défaut dans ce cas produit le même effet que @synthesize list = _list;.

8
Phillip Mills