为了账号安全,请及时绑定邮箱和手机立即绑定

在Objective-C类中混合C函数

在Objective-C类中混合C函数

潇潇雨雨 2019-11-26 13:17:09
我正在编写一个Objective-C类,但是它使用用C编写的API。这很好,因为将C调用与Objective-C调用混合使用不会引起什么问题。但是,API调用之一需要回调方法(示例):success = CFHostSetClient(host, MyCFHostClientCallBack, &context);MyCFHostClientCallBackC函数定义在哪里:static void MyCFHostClientCallBack(CFHostRef host, CFHostInfoType typeInfo, const CFStreamError *error, void *info);我可以/如何调用Objective-C方法代替它?我可以/应该将C函数与我的Objective-C调用混合使用吗?如何将C函数与Objective-C方法混合使用?
查看完整描述

3 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

要从C回调调用Objective-C代码,我将使用类似以下内容的代码:


void * refToSelf;

int cCallback()

{

    [refToSelf someMethod:someArg];

}


@implementation SomeClass

- (id) init

{

     self = [super init];

     refToSelf = self;

}

- (void) someMethod:(int) someArg

{

}


查看完整回答
反对 回复 2019-11-26
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

我可以/如何调用Objective-C方法代替它?


你不能。


可以/应该在我的Objective-C调用中混用C函数吗?


是。编写一个C函数,并将其用作CF函数的回调。


如何将C函数与Objective-C方法混合使用?


您可以将其设置self为info上下文结构中的指针。这将传递给回调。然后,在回调中,将info指针转换回id:


MyClass *self = (id)info;

然后,您可以发送self消息。但是,由于C函数在该@implementation部分之外,因此您仍然不能直接访问实例变量。您必须将它们设置为属性。您可以使用类扩展来做到这一点。(与该文档相反,您不会在内声明扩展名@implementation,而是在与扩展名相同的文件中声明该扩展名,通常在其上方。)


查看完整回答
反对 回复 2019-11-26
  • 3 回答
  • 0 关注
  • 601 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信