首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将实例方法作为函数指针传递给C库

将实例方法作为函数指针传递给C库
EN

Stack Overflow用户
提问于 2013-03-01 20:25:47
回答 1查看 3.2K关注 0票数 17

我正在编写一个使用C库的Objective-C应用程序。我目前面临的问题是,C库有一种结构,其中一些字段是函数指针,后来用作回调。如何将Objective-C实例方法转换为函数指针并将其传递给库?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-01 20:34:42

您将需要在Objective-C类实现文件中提供C回调函数,并且只有当回调能够使用某种上下文指针时,这才能起作用。

所以想象一下C回调签名是这样的:

代码语言:javascript
复制
void myCallback(void *context, int someOtherInfo);

然后在Objective-C类实现文件中,您需要使用该回调来弹回您的Objective-C类(使用上下文指针作为要调用的类的实例):

代码语言:javascript
复制
// Forward declaration of C callback function
static void theCallbackFunction(void *context, int someOtherInfo);

// Private Methods
@interface MyClass ()
- (void)_callbackWithInfo:(int)someOtherInfo;
@end

@implementation MyClass

- (void)methodToSetupCallback
{
    // Call function to set the callback function, passing it a "context"
    setCallbackFunction(theCallbackFunction, self);
    ...
}

- (void)_callbackWithInfo:(int)someOtherInfo
{
    NSLog(@"Some info: %d", someOtherInfo);
}

@end

static void theCallbackFunction(void *context, int someOtherInfo)
{
    MyClass *object = (MyClass *)context;
    [object _callbackWithInfo:someOtherInfo];
}

如果您的C回调函数不接受某种上下文信息,那么:

  1. 它被破坏了,这应该被修复/报告为错误。
  2. 你需要依赖于将指向自身的指针存储在全局的、静态的、供C回调函数使用的作用域中。这会将MyClass的实例数限制为一个!
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15157759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档