我正在编写一个Objective-C类,但它使用了一个用C编写的API.这基本上是好的,因为混合使用C调用和Objective-C调用几乎不会引起什么问题.

但是,其中一个API调用需要回调方法(示例):

success = CFHostSetClient(host, MyCFHostClientCallBack, &context);

其中MyCFHostClientCallBack是定义如下的C函数:

static void MyCFHostClientCallBack(CFHostRef host, CFHostInfoType typeInfo, const CFStreamError *error, void *info);
  1. 我能/怎么称呼Objective-C方法来代替这个?
  2. 我可以/应该将C函数与Objective-C调用混合使用吗?
  3. 如何将C函数与Objective-C方法混合使用?

推荐答案

混合C和Objective-C方法和函数是可能的,下面是一个在iPhone应用程序中使用SQLite API的简单示例:(course site)

下载Zip file (09_MySQLiteTableView.zip)

C函数需要在Objective-C(.m)文件中的@implementation之外声明.

int MyCFunction(int num, void *data)
{
     //code here...
}

@implementation

- (void)MyObjectiveCMethod:(int)number withData:(NSData *)data
{
      //code here
}

@end

因为C函数在@implementation之外,所以它不能调用

[self doSomething]

而且无法使用IVAR.

只要回调函数采用userInfocontext类型的参数(通常为void*类型),就可以解决这个问题.这可用于将任何Objective-C对象发送到C函数.

正如在sample code中一样,这可以通过正常的Objective-C操作进行操作.

此外,请阅读以下答案:Mixing C functions in an Objective-C class

Objective-c相关问答推荐

如何用零填充左侧的整数?

ios 使用 AVFramework 捕获图像

如何从 Appdelegate 显示 UIAlertController

UITextField 中的文本在编辑后向上移动(编辑时居中)

iOS NSLayoutConstraint 使用 constraintWithItem 固定宽度

如何从 AVPlayer(不是 AVAudioPlayer)获取持续时间?

dispatch_async(dispatch_get_main_queue(), ^{...});等到完成?

Lipo错误!!无法打开输入文件

强制iphone应用程序以编程方式重新启动?

从 UITabBarController 在当前上下文中呈现模态视图控制器后出现黑屏

Cocoapods ld:找不到-lPods-Projectname 的库

UICollectionView 更新单个单元格

目标覆盖 FRAMEWORK_SEARCH_PATHS 构建设置

iPhone SDK:如何在视图中播放视频?而不是全屏

状态栏文本 colored颜色 iOS 7

更改 UITextField 占位符字体

无法加载从设备上运行的包中的 nib 引用的图像

Xcode没有编译任何项目? 'clang 失败,退出代码 255'

有没有办法在用户已经在 iOS 上拒绝相机访问权限后向他们询问?

Objective-C in,out,inout,byref,byval, .. 等等.这些是什么?