33 votes

Personnalisé Getter & Setter iOS 5

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?

88voto

jlehr Points 9809

Yep, ce sont infinies boucles récursives. C'est parce que

self.season = s;

qui se traduit par le compilateur dans

[self setSeason:s];

et

return self.season;

est traduit en

return [self season];

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 variable season 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 écrit

@synthesize season = _season;

ou, mieux encore, d'omettre l' @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.

16voto

Jeremy Points 5868

Si vous souhaitez implémenter vos propres getter et setter, vous devez gérer 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
}
 

5voto

Noah Witherspoon Points 35239

Ce qui vous manque, c'est que le compilateur Objective-C transforme la syntaxe self.foo = bar 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 Jeremy le suggère, vous devez les implémenter de manière à ce que le configurateur attribue 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.

-9voto

jack Points 147

Ce qui suit devrait fonctionner:

 self->season = s; 
 

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