[resolu] @public ?
tablier
Membre
J'ai beau lire et relire la doc, je ne trouve pas! (et je ne trouve pas non plus d'exemple là -dessus)
J'ai 3 objets 'fils' de NSObject. Dans un des objets, je déclare:
D'après la doc, les champs déclarés @public sont visibles dans tout le programme. Tous mes champs déclarés @public doivent être utilisés par +sieurs méthodes de 2 autres objets. Ces objets sont batis sur le même modèle que le controleur:
Comment dois-je m'y prendre pour rendre visibles dans d'autres objets des variables déclarées @public.
merci d'avance.
J'ai 3 objets 'fils' de NSObject. Dans un des objets, je déclare:
@interface Controleur : NSObject {<br />...... ici les déclarations protégées.<br />@public<br /> BOOL bool1, bool2, ........bool27 ;<br /> int int1, int2, ........ int5 ;<br /> NSMutableString *mut1, *mut2, ...... *mut7 ;<br />}<br />.... ici les méthodes<br />@end
D'après la doc, les champs déclarés @public sont visibles dans tout le programme. Tous mes champs déclarés @public doivent être utilisés par +sieurs méthodes de 2 autres objets. Ces objets sont batis sur le même modèle que le controleur:
@interface objet1_ou_2 : NSObject {<br />...... ici les déclarations<br />}<br />.... ici les méthodes<br />@end
Je n'arrive pas à acceder à mes variables @public depuis les méthodes des 2 objets. J'ai essayé extern et également d'ajouter un import du controleur.h dans les .h des deux objets. ça ne marche pas: j'ai soit l'erreur "première définition d'une variable", soit un plantage au lancement!Comment dois-je m'y prendre pour rendre visibles dans d'autres objets des variables déclarées @public.
merci d'avance.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
extern ne marche pas ?
Comme cela ça marche, mais bon, c'est le recours à C
========================
// fichier classA
NSRect aFrame;
@interface
...
@end
====================
//fichier classB
extern NSRect aFrame;
@implementation
-(void)awakeFromNib{
NSLog(@%f,aFrame.origin.x);
...
}
J'ai oublié de dire que les trois objets sont définis sous IBuilder. ils sont accessibles par des IBOutlets. J'ai ajouter un outlet à un des 2 objets, et j'ai relié l'objet au controleur, tel que [cetOutlet methodeDuControleur] ; fonctionne correctement dans l'objet. Donc cetOutlet pointe bien l'instance de controleur. Néanmoins, cetOutlet->bool1 me donne l'erreur:
error: 'struct objc_object' has no member named 'pC_dosSrc'
et cetOutlet.bool1 me donne l'erreur:
error: request for member 'pC_dosSrc' in something not a structure or union
Il y a vraiment quelque chose que je ne comprends pas!!
Je n'ai rien contre l'emploi du C! Néanmoins, j'aimerais bien savoir comment on s'y prend avec @public
(la curiosité est un vilain défaut, sauf pour les scientifiques!)
//
// Prefix header for all source files of the 'ClosingBox' target in the 'ClosingBox' project
//
#ifdef __OBJC__
  #import <Cocoa/Cocoa.h>
#endif
NSString * aString;
========================
// fichier ClassA
@implementation ClassA
-(void) mouseDown:(NSEvent *) theEvent {
  [aString release];
  aString=@deuxieme version ;
}
@end
====================
//fichier classB
@implementation ClassB
-(void)awakeFromNib{
  aString=@premier version;
}
Il faudrait que bool1 soit défini comme une property.
Autre solution, utiliser KVC : [cetOutlet valueForKey:@bool1] qui devrait renvoyer un NSNumber.
Quand à @public et ses associés, je suis comme toi, je suis curieux de savoir dans quelle occasion, cela sert. Cela me semble être là pour "faire propre" dans des classes à utilisation sécurisée.
Ce code fonctionne chez moi sans problèmes...
Bon, j'ai une solution: Comme dit précédemment, j'ai dans l'objet un outlet qui pointe le controleur et j'ai essayer: cetOutlet->bool1, ce qui me donne une errreur (voir plus haut).
Vu le code de schlum, j'ai modifié mon code ainsi:
ça marche! Donc mon erreur a été de croire que le compilateur savait sur quoi pointait cetOutlet!
Pour vérification j'ai écrit: boule = ((Controleur *)cetOutlet)->bool1 ; ça marche aussi!
Merci pour votre aide.
IBOutlet Controleur *cetOutlet;
IBOutlet n'est pas un type, c'est juste un marqueur pour IB !
Sous Xcode 3 IB incite à mettre le type d'objet pointé, mais sous 2.5 ce n'est pas évident.
Bon je vais retourner dans IB et mettre le bon type d'objet pour cet outlet.
De même pour les propriétés Objective-C 2 qui s'écrivent monObjet.var.
En ce qui concerne le @public, en programmation orientée-objet, c'est sale. Et ça n'est utilisé que dans des cas très particulier. Personnellement, je ne l'ai jamais utilisé, par contre je l'ai déjà vu utilisé dans les sources de GNUStep, mais uniquement dans des classes privées, dans des classes qui utilisent généralement d'autres classes et qui rend l'accès plus rapide.
Mais en Obj-C ça n'a pas grand sens puisqu'on ne peut pas instancier sur la pile...
Jamais utilisé non plus.
:P :P
L'intérêt d'un smart pointer, c'est de pourvoir allouer des trucs dans le constructeur et que ça soit désalloué dans le destructeur automatiquement (donc en cas d'exception levée etc...)