Déclarer des variables globales

muqaddarmuqaddar Administrateur
14:50 modifié dans API AppKit #1
Salut les gens perchés en haut des cocoayers !

J'ai l'impression qu'il n'y a que moi qui pose mes problèmes en ce moment.
Voilà , j'ai un contrôleur dans lequel j'ai 4 méthodes qui appellent des sheets d'alertes avec les même messages d'alerte :

- (IBAction)removeGroup:(id)sender<br />{<br />  NSString *title = @&quot;Warning !&quot;;<br /> NSString *defaultButton = @&quot;Delete&quot;;<br />    NSString *alternateButton = @&quot;Don&#39;t Delete&quot;;<br />       NSString *otherButton = nil;<br />      NSString *message = @&quot;Are you sure you want to delete the selected group?&quot;;<br />     NSBeep();<br /> NSBeginAlertSheet(title, defaultButton, alternateButton, otherButton, mainWindow, self, @selector(sheetDidEndGroups:returnCode:contextInfo:), nil, nil, message);<br />}<br /><br />- (void)sheetDidEndGroups:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo<br />{<br /> if (returnCode == NSAlertDefaultReturn) [groupsController remove: _groups];<br />}


Mon idée était de mettre ces 4 chaines :
NSString *title = @Warning !;
NSString *defaultButton = @Delete;
NSString *alternateButton = @Don't Delete;
NSString *otherButton = nil;
dans le controler.h au dessous des accolades avec les IBactions par exemple afin de les déclarer "globalement" une seule fois. Je l'ai fait. ça marche. Mais je ne sais pas si c'ets propre et si c'ets à  faire... En tout cas, le fichier d'implémentation les reconnaà®t.

Voilà  que j'ai été amené à  créer une catégorie à  mon controleur pour la gestion des barres d'outils. Patati patata, pas d'erreurs de code, mais alors un pétage de plomb au lancement du programme :

[tt][Session started at 2004-09-22 00:09:47 +0200.]
ZeroLink: warning duplicate symbol: _alternateButton
          will use: /Users/osxitan/Cocoa/cocoaProd/wm/build/wm.build/wm.build/Objects-normal/ppc/AppController.ob
          also in: /Users/osxitan/Cocoa/cocoaProd/wm/build/wm.build/wm.build/Objects-normal/ppc/PrefsToolBarDelegateCategory.ob
[/tt]

Apparemment, ces déclarations de variables globales ne plaisent pas à  la catégorie...
Une idées les cracks ?

Réponses

  • Eddy58Eddy58 Membre
    14:50 modifié #2
    Je comprend pas pourquoi tu ne declares pas tes chaines en global dans ton interfaçage, puis tu les initialises ensuite dans awakeFromNib ?
  • muqaddarmuqaddar Administrateur
    14:50 modifié #3
    ah bein tient, on va essayer ça. :)
    Parce que j'aime bien ce qui est compliqué peut-être.
  • muqaddarmuqaddar Administrateur
    14:50 modifié #4
    En effet ça marche.
    Merci.

    Néanmoins, avais-je le droit de faire ce que j'ai fait "techniquement" ?
  • ClicCoolClicCool Membre
    septembre 2004 modifié #5
    Finalement je dors toujours pas ! ;)

    tu as le droit d'écrire
    NSString *maChainePartagée = @&quot;Delete&quot;;
    


    Et si tu veux que la chaine defaultButton soit accessible de toutes les méthodes définies dans ton fichier.m
    tu dois le placer AVANT la ligne @implementation... de ton fichier .m

    NSString * maChainePartagée = @&quot;Delete&quot;&quot;; // r11s3<br /><br />@implementation VRAntiqueRecord<br />.../...<br />- (id) init {<br />.../...
    

    ;)
  • muqaddarmuqaddar Administrateur
    14:50 modifié #6
    Et au final, ça revient au même que la méthode d'Eddy ?
    C'est quoi l'avantage ? Quel est le meilleur choix ?
  • septembre 2004 modifié #7
    La déclaration des variables globales se fait comme dans la pure tradition C  :)

    Tu définis dans ton .m tes variables (avant l'implémentation comme l'as écrit ClicCool).

    <br />NSString *VARGLOB1;<br />NSString *VARGLOB2;<br />...<br /><br />@implementation<br />{<br />&nbsp; ...<br />}<br /><br />...<br /><br />@end<br />
    


    et tu utilises l'appel [tt]extern[/tt] dans ton .h pour que tes variables soient connus dans tous les .m qui en auront besoin

    <br />extern NSString *VARGLOB1;<br />extern NSString *VARGLOB2;<br /><br />@interface<br />{<br />&nbsp; ...<br />}<br /><br />...<br /><br />@end<br />
    


    Les externs doivent se trouver en dehors de l'interface.

    Concernant les externs, tu n'as pas obligé de les mettre dans le .h. Si par exemple, tes variables sont déclarées dans FicGlob.m et que tu en besoin dans le source du fihcier FicMain.m tu peux mettre les extern direcetement dans ce dernier (mais c'est un peu bordélique, je préfère donc les mettre dans FicGlob.h)


  • muqaddarmuqaddar Administrateur
    14:50 modifié #8
    Merci à  vous, c'est plus clair maintenant.
  • nucleusnucleus Membre
    14:50 modifié #9
    Une solution, plus maintenable à  mon gout, est de regrouper des variables globales et les transformer propriétés/attributs d'une classe et de n'avoir qu'une instance de cette classe (avec ou sans singleton)
  • mpergandmpergand Membre
    14:50 modifié #10
    Oui, les variables globales, c'est du bricolage (à  la C) et c'est pas vraiment objet. On peut définir une classe avec des membres static, ou mieux, pour les puristes, utiliser le pattern singleton, comme le suggère nucleus.
  • TiffTiff Membre
    14:50 modifié #11
    Oui, les variables globales, c'est du bricolage (à  la C)

    Tu voulais dire à  la C.. , non ? ;D
    Bon, je sors. :'(
  • ClicCoolClicCool Membre
    14:50 modifié #12
    dans 1095870006:

    Oui, les variables globales, c'est du bricolage (à  la C)

    Tu voulais dire à  la C.. , non ? ;D
    Bon, je sors. :'(

    mdr  :P
  • Eddy58Eddy58 Membre
    14:50 modifié #13
    dans 1095861740:

    Oui, les variables globales, c'est du bricolage (à  la C) et c'est pas vraiment objet. On peut définir une classe avec des membres static, ou mieux, pour les puristes, utiliser le pattern singleton, comme le suggère nucleus.


    Je suis tout à  fait d'accord avec toi Mpergand, avec ce genre de bricolage à  la C.. ;D et bien l'on "bafoue" si je puis dire l'un des principes fondamental de la programmation objet : L'encapsulation. Mais dites-moi, Nucleus ou Mpergand, qu'est-ce que le "pattern singleton" ???
  • ClicCoolClicCool Membre
    14:50 modifié #14
  • Eddy58Eddy58 Membre
    14:50 modifié #16
    Merci pour ces liens ClicCool et Mpergand ! :)

    Je ne connaissais pas du tout ce principe des design patterns qui est plutot vaste apparemment. Intéressant le singleton, faudra que je regarde ca de plus près. Encore une chose de plus à  ma liste déjà  loooonnnggguuueeeeeee  ;D
  • nucleusnucleus Membre
    septembre 2004 modifié #17
    Voici une page (en anglais) qui parle du design pattern "Singleton" avec Objective-C:
    http://www.cocoadev.com/index.pl?SingletonDesignPattern

    Si tu veux approfondir le sujet des Design Patterns, je te conseille fortement de lire "Design Patterns: Elements of Reusable Object-Oriented Software" (les exemples sont en C++ si je me souviens bien)..
    C'est notamment "l'acte de naissance" du design pattern Singleton..
  • Eddy58Eddy58 Membre
    14:50 modifié #18
    Ok merci pour toutes ces indications, mais c'est surtout le pattern singleton qui attire mon attention dans tout ça. :)
Connectez-vous ou Inscrivez-vous pour répondre.