项目中用到了C++与OC混编,正好有时间来总结一下.
基本思路: C++中是不能直接调用OC代码的,所以要通过一个中介--C,来让他们建立联系,从而实现在C++中调用OC代码.
1.新建C++文件
- Xcode会自动生成.hpp和.cpp的默认文件(由于Xcode不需要手动编译链接,因此写到.hpp和.cpp中没有差别,以下默认写到.hpp中)
2.在.hpp中实现如下代码(TestObject.hpp)
public:
void testFunction(int temp){
c_testFunction(temp);
}
- tips:如果是重载方法,需要在函数名后面加override ("如 void init() override ")
3. 创建.mm文件(LNTestObject.mm)
- 在.mm中写C实现并调用OC方法
//C中不能直接使用self来调用OC方法,这里使用单例创建对象(调用方法前需要先创建单例)
static LNTestObject*testObject =nil;
+ (instancetype)shareInstance{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
testObject = [[self alloc] init];
});
return testObject;
}
//C实现
void c_testFunction(int temp){
[testObject c_testFunction:temp];
}
//OC实现
- (void)c_testFunction:(int)temp{
NSLog(@"temp=%zd",temp);
}
4.创建桥接文件并在.hpp中include(TestObject-C-Interface.h)
- 目的是让.hpp中c++方法能找到对应c的方法
//声明实现的C方法
void c_testFunction(int temp);
- 最后需要注意的:根据编译器特性,LNTestObject.mm 中实现的C方法不必再LNTestObject.h中再声明
github demo 地址: https://github.com/KrystalNa/oc-c-demo