La obtención de un puntero a un método de clase, de modo que se puede pasar como una devolución de llamada a una función de C

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

Pregunta

Estoy usando libssh2 y tienen una función de devolución de llamada se definen fuera de mi SSHWrapper objeto:

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);

Desde dentro de mi SSHWrapper objeto hago lo siguiente, pasando a la función de devolución de llamada cuando authenticaing de la sesión:

/* 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);

Lo que me pregunto es, ¿es posible mover el kbd_callback() función dentro de mi objeto, de modo que es un método de clase: +(void) kbd_callback:...?

Si es así, ¿cómo puedo obtener la dirección de la función para pasar a la función de C libssh2_userauth_keyboard_interactive()?

¿Fue útil?

Solución

El enfoque que está tomando ahora es razonable.Dicho esto, Objective-C, métodos son, de hecho, sólo las funciones C.La principal cosa que complica el enfoque que sugiero es que entre ellos dos "ocultos" de los argumentos, self, y _cmd. self es la instancia del objeto se llama el método, y _cmd es el selector para el método.Usted no puede cambiar estos y su presencia hará lo imposible para hacer que sus argumentos coinciden con los requeridos por la función de devolución de llamada.

Sólo en caso de que todavía interesante para usted, usted puede obtener un puntero a la función de un Objetivo-C método así:

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

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

EDITAR:He publicado un sencillo y completo programa que muestra este código en acción aquí: https://gist.github.com/2731937

Otros consejos

No.El subyacente de la función de C que se crea por + (void)method no debería ser llamado directamente en esto de la moda.A menos que esté muy familiarizado con el Objetivo subyacente-tiempo de ejecución de C, jugar con el IMP funciones sólo va a meter en problemas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top