Déclarer des variables globales
muqaddar
Administrateur
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 :
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 ?
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 = @"Warning !";<br /> NSString *defaultButton = @"Delete";<br /> NSString *alternateButton = @"Don't Delete";<br /> NSString *otherButton = nil;<br /> NSString *message = @"Are you sure you want to delete the selected group?";<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 ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Parce que j'aime bien ce qui est compliqué peut-être.
Merci.
Néanmoins, avais-je le droit de faire ce que j'ai fait "techniquement" ?
tu as le droit d'écrire
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
C'est quoi l'avantage ? Quel est le meilleur choix ?
Tu définis dans ton .m tes variables (avant l'implémentation comme l'as écrit ClicCool).
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
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)
Tu voulais dire à la C.. , non ? ;D
Bon, je sors.
mdr :P
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" ???
Creating a Singleton Instance
http://smeric.developpez.com/java/uml/singleton/
http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html
http://prografix.games-creators.org/document/204
Pas facile de trouver un ex qui ne soit pas en javaÂ
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
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..