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