C n'est pas Objective-C !

tabliertablier Membre
octobre 2009 modifié dans API AppKit #1
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:
@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
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!
Donc, comment fait-on pour appeler une méthode ObjC  dans une routine en C, ou pour utiliser une variable ObjC ?

Réponses

  • zoczoc Membre
    22:31 modifié #2
    NSString *attrape(Control *aControl) <br />{<br />&nbsp; &nbsp; return [aControl leContenu];<br />}<br />
    


    self n'est évidemment utilisable que dans les "méthodes" de la classe, pas dans des fonctions C globales.
  • AliGatorAliGator Membre, Modérateur
    22:31 modifié #3
    Pour rappel :
    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.
  • tabliertablier Membre
    octobre 2009 modifié #4
      :adios!: Ok, merci. C'est plus qu'un rappel pour moi. Je vais me coucher moins bête ce soir!



      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.
Connectez-vous ou Inscrivez-vous pour répondre.