Pb de compréhension de syntaxe...
vinko
Membre
Bonjour,
Je viens de regarder le code qui est généré automatiquement par XCode 4
pour la création d'un projet TabBar.
XCode écrit ça :
@synthesize window = _window;
Alors qu'avant, j'écrivais juste ça :
@synthesize window;
Quel est l'avantage de la nouvelle déclaration ? Et comment se traduit
ce signe _ dans la déclaration ?
Merci,
Vincent
Je viens de regarder le code qui est généré automatiquement par XCode 4
pour la création d'un projet TabBar.
XCode écrit ça :
@synthesize window = _window;
Alors qu'avant, j'écrivais juste ça :
@synthesize window;
Quel est l'avantage de la nouvelle déclaration ? Et comment se traduit
ce signe _ dans la déclaration ?
Merci,
Vincent
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Je ne savais pas qu'il y avait une sécurité au niveau de la mémoire qui venait s'ajouter...
Habituellement, la variable d'instance porte le même nom que le propriété. En utilisant la notation @synthesize window = _window, la variable d'instance s'appelle _window.
Ainsi, on ne risque pas d'écrire:
window = uneNouvelleFenetre;
alors que ce qu'ont veut écrire est:
self.window = uneNouvelleFenetre;
Dans le deuxième cas, la méthode [self setWindow:] est appelée, ce qui est plus probablement ce qu'on veut faire avec un propriété en retain.
Il me semble que dans les autres langages la variable d'instance n'est composé que d'un "_".
m'en tenir au fait que ça sécurise l'écriture et mémoire en même temps...
Merci à tous,
Vincent
Surtout que j'ai lu de travers... je parlais de méthodes privées. Dure journée en perspective... :-)
pour les méthodes privé, _ est toujours réservé. Par contre pour les ivar j'ai lu qu'Apple avait migré de _ à __ justement, donc attention aux collisions...
Tout le monde utilise "_" comme préfixe pour ses variables privées et Apple fait avec, du coup Apple tend à utiliser "__" pour nous laisser "_", et le code généré par Xcode4 ou proposé par les templates utilise "_".
Sinon pour compléter les réponses plus haut, @synthesize window est équivalent à @synthesize window = window; c'est à dire que si tu précises pas, ça génère sous le capot une variable d'instance du même nom que la propriété, alors que si tu précises tu peux indiquer un autre nom de variable d'instance sous-jacente à la propriété. Mais bon vu que la pratique et les recommandations d'Apple incitent à n'utiliser que les propriétés directement (et pas les variables d'instances sous-jacentes associées, au risque d'oublier des détails lors de leur manipulation sinon) limite tu peux tout à fait ne pas savoir que ces variables d'instances sont créées ni comment ça marche sous le capot tu utilises les propriétés directement.
Hé ben... merci pour l'info !
Est ce que la gestion des pointeurs est la même entre un setWindow:toto et self.window = toto ?
self->window n'est pas valable en ObjC, puisqu'il faudrait que self soit un pointeur de structure ce qui n'est pas le cas (contrairement au C++).
Les deux notations sont totalement équivalentes. Mais attention, il ne s'agit pas de gestion de pointeurs (qui ne sont que des références vers des objets) mais de la gestion mémoire.
Correction, self->window est équivalent à accéder à la variable d'instance window directement.
C'est d'ailleurs à utiliser (pour ceux qui se bornent à encore utiliser les variables d'instance sous iOS ou sous OSX.6+) pour accéder aux variables d'instance @protected d'une classe mère, même en ObjC. Mais bon on s'éloigne, et c'est vraiment un cas très très rare.
- [font=courier new,courier,monospace]window[/font] est donc la variable d'instance (tout comme [font=courier new,courier,monospace]self->window[/font] bien plus rarement utilisé car inutile dans 99.9% des cas)
- [font=courier new,courier,monospace]self.window[/font] est la propriété, et un appel à [font=courier new,courier,monospace]self.window = x[/font] est strictement équivalent à (et traduit au final par le compilateur en) [font=courier new,courier,monospace][self setWindow:x][/font], donc à l'appel au setter, tout comme un appel à [font=courier new,courier,monospace]x = self.window[/font] est strictement équivalent à (et traduit au final par le compilateur en) [font=courier new,courier,monospace]x = [self window][/font], donc à l'appel au getter
/rolleyes.gif' class='bbc_emoticon' alt='::)' />
Je m'en sers parfois pour simuler la notion de classe amie du C++.
ou dans exemple suivant:
pour éviter de dupliquer l'image, un retain suffit et il vaut mieux ne pas appeler setRowImage pour faire ça /biggrin.png' class='bbc_emoticon' alt=':D' />