-
注意事项:
-
OC 与 C++ 对象在内存管理上是不一样的。所以我们无法直接将一个 OC 对象直接赋值给一个 C++ 对象,或者相反。
-
第二点,OC 与 C++都支持指针,可以通过指针进行桥接。例如在一个 C++ 类中声名一个 OC的指针。
- 第三点,也是最重要的一点,clang可以通过程序文件的后辍名选择不同的编译器对其进行编译。如文件后辍名是
.m
,它会使用 OC编译器;如果是.mm
,它会使用 Object-C++编译器。而既用到 OC,又用到 C++ 的程序文件则应该使用.mm
后缀。因为 Object-C++编译器可以识别出两种风格的语法,而OC编译器却不能。
OC调用c语言:
方法一:c语言可以直接在OC的类中写方法:
-(void)playvideobtn{
调用c语言方法:
sayHello();
}
c语言方法:
void sayHello(){
printf("Hello OC");
}
方法二:c语言单独的类文件,然后在oc类中#include后调用c语言方法;
testtwo.h
#ifndef testtwo_h
#define testtwo_h
#include <stdio.h>
void sayHello();
#endif /* testtwo_h */
testtwo.m
#include "testtwo.h"
void sayHello(){
printf("我是oc调用c");
}
oc中:#include "testtwo.h"
-(void)playvideobtn{
调用c语言方法:
sayHello();
}
OC调用c++:
TestCPP.hpp
#ifndef TestCPP_hpp
#define TestCPP_hpp
#include <stdio.h>
class TestCPP{
public:
TestCPP();
virtual ~TestCPP();
private:
int a;
public:
void sayHello();
};
#endif /* TestCPP_hpp */
TestCPP.mm原来是.cpp后缀的,这里要改成.mm后缀,否则报错
#include "TestCPP.hpp"
TestCPP::TestCPP(){
}
TestCPP::~TestCPP(){
}
void TestCPP::sayHello(){
printf("oc调用c++的方法");
}
调用的时候#include "TestCPP.hpp";当前的OC文件要改成.mm后缀;
-(void)playvideobtn{
TestCPP().sayHello();
/*也可以这样调用,但是要自己释放
TestCPP *testcpp=new TestCPP();
testcpp->sayHello();
*/
NSLog(@"我是OC,调用c++");
}
c语言调用OC:
从汇编角度来看:无论是C函数或者是OC方法,他们同样都是一个函数的地址。区别在于:C函数调用直接通过 函数名(参数)找到函数指针,直接执行函数地址,不需要考虑其他问题,只要定义好就能直接用. OC 是属于类的方法,结构上多了一层封装性,要调方法必须要找到 类的地址然后再通过类的地址找到方法的地址,然后再执行函数地址。那么:如何能够在C函数里面调用OC的方法呢?答案就是:指定一个全局变量来保存类的地址,在通过类的地址找到类方法(函数)的地址调用。
把当前的c语言类改成.mm后缀,#import进oc的类,然后在c语言的方法中按照oc的写法就可以了;
#include "testtwo.h"
#import "TestOC.h" 引进的oc类
void sayHello(){
//这是c语言调用oc
TestOC *testoc=[[TestOC alloc]init];
[testoc cTestoc];
}
在C语言方法中使用oc的语法:先#include <Foundation/Foundation.h>,然后报错提示,把Compile Sources As 改成Object-c就好了;
c++调用OC:
把当前的c++类改成.mm后缀,#import进oc的类,然后在c++的方法中按照oc的写法就可以了;
TestCPP.hpp
#ifndef TestCPP_hpp
#define TestCPP_hpp
#include <stdio.h>
class TestCPP{
public:
TestCPP();
virtual ~TestCPP();
private:
int a;
public:
void sayHello();
};
#endif /* TestCPP_hpp */
TestCPP.mm
#include "TestCPP.hpp"
#import "TestOC.h"
#import <UIKit/UIKit.h>
TestCPP::TestCPP(){
}
TestCPP::~TestCPP(){
}
void TestCPP::sayHello(){
//这是c++调用oc
TestOC *testoc=[[TestOC alloc]init];
[testoc cTestoc];
}