ios之OC与C、OC与c++互相调用OC与C++的互相调用

OC与C++的互相调用

https://blog.csdn.net/qq_37240033/article/details/54962835

ios之OC与C、OC与c++互相调用

https://blog.csdn.net/u011146511/article/details/108869498

 

注意事项:

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];

}

————————————————
版权声明:本文为CSDN博主「liyubao160」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011146511/article/details/108869498

posted @ 2022-05-04 15:31  itlover2013  阅读(1661)  评论(0编辑  收藏  举报