web-dev-qa-db-fra.com

Getter & Setter personnalisés 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?

33
alex

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.

88
jlehr

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
}
16
Jeremy

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.

5
Noah Witherspoon