La coutume de lecture & Poseur de iOS 5
Je veux remplacer les getter et setter dans mon ObjC classe à l'aide de l'ARC.
.h Fichier
@property (retain, nonatomic) Season *season;
.m Fichier
@synthesize season;
- (void)setSeason:(Season *)s {
self.season = s;
//do some more stuff
}
- (Season *)season {
return self.season;
}
Suis-je manqué quelque chose?
- Noter que ce modèle conduit à la folie; en particulier, cela signifie que
setSeason:
doit toujours être atomique, partie intégrante de l'opération sur votre modèle de données. Si votre code à évoluer de sorte qu'il y a une autre propriété dont la valeur est dépendante deseason
, alors vous êtes de gauche avec une commande de dépendance ("je dois définir" l'autre "avant que j'appellesetSeason:
parce quesetSeason:
a une logique d'entreprise qui dépend des "autres"). Mieux pour garder setter/getter stupide simple et de garder la logique d'entreprise distincts. - Eh bien dans mon cas, je vais juste mettre à jour la vue avec les nouvelles données de la
season
... - Mais si vous gardez le setter/getter stupide simple et de garder la logique d'affaires distincte vous avez juste déplacé le problème. Là, vous devez vous rappeler que chaque fois que vous appelez
setSeason:
vous devez également appelersomeBusinessLogicBasedOnSeason:
et vous avez encore à me demander si vous avez besoin de faire tout cela avant ou après vous définissez les autres. - Un bon modèle est à l'aide de setter pour invalider les données, par exemple, il y a deux setters
setSeason:
,setYear:
et ils ont tous deux faire_seasonalDataNeedsUpdate = YES;
. Mise à jour réelle qui se produit plus tard, si nécessaire (par exemple, si l'utilisateur n'a pas l'annuler). Cela prend en charge de la commande et nous permet de ne pas tirer les mêmes informations plusieurs fois. - Oh mon dieu, ilya, je vous remercie beaucoup! J'ai été littéralement arraché mes cheveux en se demandant pourquoi l' _ notation parfois travailler et n'a parfois pas.
Vous devez vous connecter pour publier un commentaire.
Oui, ceux sont infinies boucles récursives. C'est parce que
est traduite par le compilateur dans
et
est traduit en
Se débarrasser de la dot-accesseur
self.
et votre code sera correct.Cette syntaxe, cependant, peut être source de confusion étant donné que votre propriété
season
et votre variableseason
partagent le même nom (bien que Xcode va un peu diminuer la confusion par la coloration de ces entités différemment). Il est possible de modifier explicitement votre nom de variable par écritou, mieux encore, omettre le
@synthesize
directive complètement. Le moderne Objective-C compilateur va automatiquement synthétiser les méthodes d'accès et de la variable d'instance pour vous.self.season = s
être convertis en[self setSeason:s]
Si vous allez mettre en place votre propre getter et setter, vous aurez besoin de maintenir une variable interne:
_season
au lieu deself.season
tout le temps alors?season
est toujours là. La seule choseseason = _season
n'est de renommer cette variable. Ce n'est cependant pas nécessaire. @jlehr expliqué comment cela fonctionne._season
,@synthesize season = _season
est inutile.La chose vous manque, c'est que l'Objective-C compilateur s'avère essentiel de la
self.foo = bar
syntaxe dans[self setFoo:bar]
, etself.foo
en[self foo]
. Vos méthodes, tel qu'il est actuellement mis en œuvre, sont eux-mêmes appeler. Comme Jeremy indique, vous avez besoin de les mettre en œuvre, tels que le setter attribue en fait la valeur, il est appelé à une variable d'instance de votre classe et de la lecture renvoie la valeur de la variable d'instance.