項(xiàng)目中用到了C++與OC混編,正好有時(shí)間來(lái)總結(jié)一下.
基本思路: C++中是不能直接調(diào)用OC代碼的,所以要通過(guò)一個(gè)中介--C,來(lái)讓他們建立聯(lián)系,從而實(shí)現(xiàn)在C++中調(diào)用OC代碼.
1.新建C++文件
- Xcode會(huì)自動(dòng)生成.hpp和.cpp的默認(rèn)文件(由于Xcode不需要手動(dòng)編譯鏈接,因此寫到.hpp和.cpp中沒有差別,以下默認(rèn)寫到.hpp中)
新建hpp文件.png
2.在.hpp中實(shí)現(xiàn)如下代碼(TestObject.hpp)
public:
void testFunction(int temp){
c_testFunction(temp);
}
- tips:如果是重載方法,需要在函數(shù)名后面加override ("如 void init() override ")
3. 創(chuàng)建.mm文件(LNTestObject.mm)
- 在.mm中寫C實(shí)現(xiàn)并調(diào)用OC方法
//C中不能直接使用self來(lái)調(diào)用OC方法,這里使用單例創(chuàng)建對(duì)象(調(diào)用方法前需要先創(chuàng)建單例)
static LNTestObject*testObject =nil;
+ (instancetype)shareInstance{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
testObject = [[self alloc] init];
});
return testObject;
}
//C實(shí)現(xiàn)
void c_testFunction(int temp){
[testObject c_testFunction:temp];
}
//OC實(shí)現(xiàn)
- (void)c_testFunction:(int)temp{
NSLog(@"temp=%zd",temp);
}
4.創(chuàng)建橋接文件并在.hpp中include(TestObject-C-Interface.h)
- 目的是讓.hpp中c++方法能找到對(duì)應(yīng)c的方法
//聲明實(shí)現(xiàn)的C方法
void c_testFunction(int temp);
- 最后需要注意的:根據(jù)編譯器特性,LNTestObject.mm 中實(shí)現(xiàn)的C方法不必再LNTestObject.h中再聲明
github demo 地址: https://github.com/KrystalNa/oc-c-demo