获取指向类方法的指针,以便可以将其作为回调传递给 C 函数
-
11-12-2019 - |
题
我正在使用 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()
?
解决方案
你现在采取的做法是合理的。也就是说,Objective-C 方法实际上只是 C 函数。使您建议的方法复杂化的主要因素是它们包含两个“隐藏”参数, self
, , 和 _cmd
. self
是正在调用该方法的对象的实例,并且 _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
其他提示
不。由以下命令创建的底层 C 函数 + (void)method
不应该以这种方式直接调用。除非您非常熟悉底层 Objective-C 运行时,否则弄乱 IMP 函数只会给您带来麻烦。
不隶属于 StackOverflow