Obtention d'un pointeur vers une méthode de classe afin qu'elle puisse être passée en rappel à une fonction C

StackOverflow https://stackoverflow.com//questions/10667587

Question

J'utilise libssh2 et j'ai une fonction de rappel définie en dehors de mon objet SSHWrapper :

static void kbd_callback(const char *name, int name_len, const char *instruction, int instruction_len, int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, void **abstract);

Depuis mon objet SSHWrapper, je fais ce qui suit, en passant la fonction de rappel lors de l'authentification de la session :

/* Create a session instance */
LIBSSH2_SESSION *session = libssh2_session_init_ex(NULL, NULL, NULL, self);
while ((rc = libssh2_userauth_keyboard_interactive(session, userChar, &kbd_callback)) == LIBSSH2_ERROR_EAGAIN);

Ce que je me demande, c'est est-il possible de déplacer le kbd_callback() fonction à l'intérieur de mon objet, pour que ce soit une méthode de classe : +(void) kbd_callback:...?

Si oui, comment puis-je obtenir l'adresse de cette fonction afin de la transmettre à la fonction C libssh2_userauth_keyboard_interactive()?

Était-ce utile?

La solution

L'approche que vous adoptez actuellement est raisonnable.Cela dit, les méthodes Objective-C ne sont en fait que des fonctions C.La principale chose qui complique l'approche que vous proposez est qu'elles incluent deux arguments "cachés", self, et _cmd. self est l'instance de l'objet sur lequel la méthode est appelée, et _cmd est le sélecteur de la méthode.Vous ne pouvez pas les modifier et leur présence rendra impossible la correspondance des arguments de votre fonction avec ceux requis pour la fonction de rappel.

Juste au cas où cela vous intéresserait toujours, vous pouvez obtenir un pointeur de fonction vers une méthode Objective-C comme ceci :

IMP methodIMP = [self methodForSelector:@selector(someMethodThatTakesOneStringArgument:)];
void (*functionPointer)(id, SEL, NSString*) = (void (*)(id, SEL, NSString*))methodIMP;

// Then call it:
functionPointer(instance, @selector(someMethodThatTakesOneStringArgument:), aString);

MODIFIER:J'ai posté un programme simple et complet qui démontre ce code en action ici : https://gist.github.com/2731937

Autres conseils

Non.La fonction C sous-jacente créée par + (void)method ne doit pas être appelé directement de cette façon.À moins que vous ne soyez très familier avec le runtime Objective-C sous-jacent, jouer avec les fonctions IMP ne fera que vous causer des ennuis.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top