C n'est pas Objective-C !
tablier
Membre
Objective-C c'est du C. Ouais, mais le contraire est faux: le C ce n'est pas de l'Objective-C!
dans une classe j'ai le schéma suivant:
Donc, comment fait-on pour appeler une méthode ObjC dans une routine en C, ou pour utiliser une variable ObjC ?
dans une classe j'ai le schéma suivant:
J'obtiens l'erreur "self undeclared". Si je remplace [self leContenu] par [o_leText stringValue], j'obtiens l'erreur: "o_leText undeclared" et si j'ajoute @public devant la déclaration de o_leText ça ne change rien!@interface Control : NSObject
{
IBOutlet NSTextField *o_leText ;
}
- (NSString *)leContenu ;
NSString *attrape() ;
@end
@implementation Control
- (NSString *)leContenu
{
return [NSString stringWithString:[o_leText stringValue]] ;
}
NSString *attrape()
{
return [self leContenu] ;
}
@end
Donc, comment fait-on pour appeler une méthode ObjC dans une routine en C, ou pour utiliser une variable ObjC ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
self n'est évidemment utilisable que dans les "méthodes" de la classe, pas dans des fonctions C globales.
1) En C, la notion de classe n'existe pas. Tout comme les fonctions/méthodes "membres d'une classe" donc.
Du coup déclarer ta méthode "attrape" dans ta classe Objective-C... ou non, ça ne change rien du point de vue du langage C qui n'a pas cette notion.
2) Quand tu écris en Objective-C [tt][toto messageWithArg:arg][/tt], cela est tratuit en C par [tt]objc_msgSend(toto,@selector(messageWithArg,arg)[/tt]. La fonction objc_msgSend étant définir ainsi : [tt]objc_msgSend(id self, SEL _cmd, ...);[/tt].
C'est là que tu vois que "self" est défini implicitement justement par ce premier paramètre "caché" [tt]id self[/tt] au moment de l'appel à la méthode. D'ailleurs pour info tu vois donc aussi que tu peux utiliser la variable cachée "_cmd" pour accéder au @selector courant, ce qui peut être utile en debug pour afficher NSStringFromSelector(_cmd) par exemple, etc.
Donc la solution pour retrouver le comportement d'Objective-C en utilisant des méthodes C, c'est de leur passer des paramètres comme le fait, derrière ton dos, l'Objetive-C.
Donc en passant "self" en paramètre à ta fonction attrape(). Comme l'a fait zoc dans son exemple en fait, en en le typant "id self" si tu veux, ça marche aussi.
Heu! je crois que j'ai parlé trop vite! faut que je réfléchisse! il me semble qu'il y a quelque chose qui m'échappe même si vos explications sont claires. je vais faire des essais et (peut-être) revenir.