Je veux remplacer le getter et le setter dans ma classe ObjC en utilisant ARC.
Fichier .h
@property (retain, nonatomic) Season *season;
Fichier .m
@synthesize season;
- (void)setSeason:(Season *)s {
self.season = s;
// do some more stuff
}
- (Season *)season {
return self.season;
}
Est-ce que j'ai râté quelque chose?
Oui, ce sont des boucles récursives infinies. C'est parce que
self.season = s;
est traduit par le compilateur en
[self setSeason:s];
et
return self.season;
est traduit en
return [self season];
Débarrassez-vous de dot-accessorself.
et votre code sera correct.
Cette syntaxe, cependant, peut prêter à confusion étant donné que votre propriété season
et votre variable season
partagent le même nom (bien que Xcode atténuera quelque peu la confusion en coloriant ces entités différemment). Il est possible de changer explicitement le nom de votre variable en écrivant
@synthesize season = _season;
ou, mieux encore, omettez le @synthesize
directive tout à fait. Le compilateur Objective-C moderne synthétisera automatiquement les méthodes d'accesseur et la variable d'instance pour vous.
Si vous allez implémenter votre propre getter et setter, vous devrez maintenir une variable interne:
@synthesize season = _season;
- (void)setSeason:(Season *)s {
// set _season
//Note, if you want to retain (as opposed to assign or copy), it should look someting like this
//[_season release];
//_season = [s retain];
}
- (Season *)season {
// return _season
}
Ce qui vous manque, c'est que le compilateur Objective-C transforme essentiellement le self.foo = bar
syntaxe en [self setFoo:bar]
, et self.foo
en [self foo]
. Vos méthodes, telles qu'elles sont actuellement implémentées, s'appellent elles-mêmes. Comme le suggère Jeremy, vous devez les implémenter de telle sorte que le setter attribue réellement la valeur avec laquelle il est appelé à une variable d'instance de votre classe et que le getter renvoie la valeur de cette variable d'instance.