从C调用Cocoa API

时间:2011-05-05 17:02:10

标签: c cocoa macos

我不知道这是否可行,但是在普通C中使用代码,是否可以从中调用Cocoa API? 像#include <cocoa.h>之类的东西,添加相应的库并去寻找它?

感谢您的帮助

2 个答案:

答案 0 :(得分:14)

如果链接到Cocoa或Foundation框架,则可以在C代码中使用objective-c。但是,如果要使用常规消息传递语法,则必须将文件扩展名从.c更改为.m,以便将其编译为objective-c。如果保留.c扩展名,则只能使用c样式的运行时调用与目标对象(即objc_msgSendobjc_getClass等)进行交互。

示例:在.m文件中

void cFunction() {
    [[NSString alloc] init];
}

在.c文件中

void cFunction() {
    void* cls = objc_getClass("NSString");
    void* obj = objc_msgSend(cls, NSSelectorFromString(CFSTR("alloc")));
    obj = objc_msgSend(obj, NSSelectorFromString(CFSTR("init")));
}

如果您选择第二种方法,请参阅Objective-C Runtime Reference

答案 1 :(得分:4)

Objective-C是C之上的一个非常薄的包装器。编译器只是翻译

 [obj message:argument];

进入C-call

 obj_msgSend(obj,@selector(message:),argument);

就是这样(其中@selector(message:)是一个神奇的编码,将选择器(方法名称)转换为计算机可理解的东西。)

因此,从编译器的角度来看,Objective-C和C之间没有太大区别。例如,您可以使用Objective-C编译器编译纯C程序,其结果与使用C编译器编译时获得的结果完全相同。

因此,将一些Objective-C与C“混合”的最简单方法是使用.m扩展名,以便编译器使用Objective-C。

这不会让你的程序突然变得非常客观C-y。您可以使用扩展程序.m保持程序几乎纯粹的C语言。使用.m,您可以毫无问题地添加几行Objective-C消息调用。