Pb de compréhension de syntaxe...

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

Réponses

  • Cela se traduit par la création d'une variable d'instance _window où la classe stocke la valeur de la propriété window. Cela sécurise l'utilisation de la propriété, par rapport à  la gestion mémoire.

  • Je croyais que c'était juste une convention pour voir les properties...

    Je ne savais pas qu'il y avait une sécurité au niveau de la mémoire qui venait s'ajouter...
  • CéroceCéroce Membre, Modérateur
    Draken a pris quelques raccourcis.

    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 d'ailleurs (mais à  confirmer) que la convention serait d'utiliser autre chose que "_" qui serait semble-t-il réservé aux APIs. moi je double "__" systématiquement.
  • Apres tu peux construire tes propres conventions on ne t'en voudra pas image/biggrin.png' class='bbc_emoticon' alt=':D' />.



    Il me semble que dans les autres langages la variable d'instance n'est composé que d'un "_".
  • Bon, étant quand même plus que néophyte à  la fois en Objective C mais en C/C++ tout cours, je vais

    m'en tenir au fait que ça sécurise l'écriture et mémoire en même temps...



    Merci à  tous,



    Vincent
  • 'Bigstorm' a écrit:


    Apres tu peux construire tes propres conventions on ne t'en voudra pas image/biggrin.png' class='bbc_emoticon' alt=':D' />.



    Il me semble que dans les autres langages la variable d'instance n'est composé que d'un "_".




    Surtout que j'ai lu de travers... je parlais de méthodes privées. Dure journée en perspective... :-)
  • 'Kubernan' a écrit:


    Il me semble d'ailleurs (mais à  confirmer) que la convention serait d'utiliser autre chose que "_" qui serait semble-t-il réservé aux APIs. moi je double "__" systématiquement.




    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...
  • AliGatorAliGator Membre, Modérateur
    'Kubernan' a écrit:


    Il me semble d'ailleurs (mais à  confirmer) que la convention serait d'utiliser autre chose que "_" qui serait semble-t-il réservé aux APIs. moi je double "__" systématiquement.
    Je confirme les dires de yoann de ce côté.



    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.
  • 'yoann' a écrit:


    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...




    Hé ben... merci pour l'info !
  • Quelle serait la différence entre self.window et self->window ?

    Est ce que la gestion des pointeurs est la même entre un setWindow:toto et self.window = toto ?
  • CéroceCéroce Membre, Modérateur
    'Bigstorm' a écrit:


    Quelle serait la différence entre self.window et self->window ?


    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++).


    'Bigstorm' a écrit:


    Est ce que la gestion des pointeurs est la même entre un setWindow:toto et self.window = toto ?


    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.
  • AliGatorAliGator Membre, Modérateur
    avril 2012 modifié #14
    'Céroce' a écrit:


    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++).


    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
  • CéroceCéroce Membre, Modérateur
    J'aurais encore appris quelque chose aujourd'hui !
  • 'AliGator' a écrit:
    pour ceux qui se bornent à  encore utiliser les variables d'instance sous iOS ou sous OSX.6+


    image/rolleyes.gif' class='bbc_emoticon' alt='::)' />
  • mpergandmpergand Membre
    avril 2012 modifié #17
    'AliGator' a écrit:


    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.




    Je m'en sers parfois pour simuler la notion de classe amie du C++.



    ou dans exemple suivant:
    <br />
    -(id) copyWithZone:(NSZone *)zone<br />
    {<br />
    CSBrowserCell* copy=[super copyWithZone:zone];<br />
    [copy-&gt;iRowImage retain];<br />
    <br />
    return copy;<br />
    }<br />
    




    pour éviter de dupliquer l'image, un retain suffit et il vaut mieux ne pas appeler setRowImage pour faire ça image/biggrin.png' class='bbc_emoticon' alt=':D' />
Connectez-vous ou Inscrivez-vous pour répondre.