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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具