我正在编写一个Objective-C类,但是它使用了用C编写的API.这很好,因为使用Objective-C调用混合C调用几乎没有问题.
但是,其中一个API调用需要回调方法(示例):
success = CFHostSetClient(host, MyCFHostClientCallBack, &context);
MyCFHostClientCallBack
C函数在哪里定义如下:
static void MyCFHostClientCallBack(CFHostRef host, CFHostInfoType typeInfo, const CFStreamError *error, void *info);
可以/如何使用Objective-C方法代替此方法?
可以/我应该将C函数与Objective-C调用混合使用吗?
如何将C函数与Objective-C方法混合使用?
rjstelling.. 49
可以混合使用C和Objective-C方法和函数,这是一个在iPhone App中使用SQLite API的简单示例:( 课程网站)
下载Zip文件(09_MySQLiteTableView.zip)
C函数需要@implementation
在Objective-C(.m)文件之外声明.
int MyCFunction(int num, void *data) { //code here... } @implementation - (void)MyObjectiveCMethod:(int)number withData:(NSData *)data { //code here } @end
因为C函数在外面@implementation
它不能调用类似的方法
[self doSomething]
并且无法访问ivars.
只要回调函数采用 通常类型的userInfo
或context
类型参数,就可以解决这个问题void*
.这可用于将任何Objective-C对象发送到C函数.
与示例代码中一样,可以使用常规的Objective-C操作来操作它.
另外请阅读以下答案:在Objective-C类中混合使用C函数
可以混合使用C和Objective-C方法和函数,这是一个在iPhone App中使用SQLite API的简单示例:( 课程网站)
下载Zip文件(09_MySQLiteTableView.zip)
C函数需要@implementation
在Objective-C(.m)文件之外声明.
int MyCFunction(int num, void *data) { //code here... } @implementation - (void)MyObjectiveCMethod:(int)number withData:(NSData *)data { //code here } @end
因为C函数在外面@implementation
它不能调用类似的方法
[self doSomething]
并且无法访问ivars.
只要回调函数采用 通常类型的userInfo
或context
类型参数,就可以解决这个问题void*
.这可用于将任何Objective-C对象发送到C函数.
与示例代码中一样,可以使用常规的Objective-C操作来操作它.
另外请阅读以下答案:在Objective-C类中混合使用C函数
要从C回调调用Objective-C代码,我会使用类似的东西:
void * refToSelf; int cCallback() { [refToSelf someMethod:someArg]; } @implementation SomeClass - (id) init { self = [super init]; refToSelf = self; } - (void) someMethod:(int) someArg { }
可以/如何使用Objective-C方法代替此方法?
你不能.
可以/我应该将C函数与Objective-C调用混合使用吗?
是.编写C函数并将其用作CF函数的回调.
如何将C函数与Objective-C方法混合使用?
您可以在上下文结构中设置self
为info
指针.这将被传递给回调.然后,在回调中,将info
指针强制转换为id
:
MyClass *self = (id)info;
然后,您可以发送self
消息.但是,您仍然无法直接访问实例变量,因为C函数位于该@implementation
部分之外.你必须把它们作为属性.您可以使用类扩展来执行此操作.(与该文档所说的相反,您不会在内部声明扩展名@implementation
,而是在与其相同的文件中,通常在其上方.)
我总是发现在这种情况下有用的是在C API之上创建一个Obj-C包装器.实现使用C函数所需的内容,并在其上构建一个Objective-C类(或两个),以便外部世界都能看到.例如,在这样的回调的情况下,您可以创建一个C函数,在其他对象上调用Obj-C委托方法.