获取指向类方法的指针,以便可以将其作为回调传递给C函数

时间:2012-05-19 17:53:59

标签: objective-c c function-pointers libssh2

我正在使用libssh2并在我的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);

在我的SSHWrapper对象中,我执行以下操作,在验证会话时传递回调函数:

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

我想知道的是,是否可以在我的对象中移动kbd_callback()函数,以便它是一个类方法:+(void) kbd_callback:...

如果是这样,我如何获取该函数的地址以将其传递给C函数libssh2_userauth_keyboard_interactive()

2 个答案:

答案 0 :(得分:6)

你现在采取的方法是合理的。也就是说,Objective-C方法实际上只是C函​​数。使您建议的方法复杂化的主要因素是它们包含两个“隐藏”参数self_cmdself是调用该方法的对象的实例,_cmd是该方法的选择器。你不能改变它们,它们的存在将使你的函数参数不能与回调函数所需的参数相匹配。

以防万一你仍然感兴趣,你可以得到一个指向Objective-C方法的函数指针,如下所示:

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

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

编辑:我发布了一个简单,完整的程序,可以在此处演示此代码:https://gist.github.com/2731937

答案 1 :(得分:-1)

没有。不应以这种方式直接调用由+ (void)method创建的基础C函数。除非您非常熟悉底层的Objective-C运行时,否则使用IMP函数只会让您遇到麻烦。