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

本文详细介绍了Objective-C与C/C++之间的互操作性,包括内存管理的区别、通过指针桥接、使用Object-C++编译器等关键点。同时,展示了OC调用C/C++代码的实例,以及C/C++如何调用OC的方法,强调了文件后缀和编译器选择的重要性。
摘要由CSDN通过智能技术生成
  • 注意事项:

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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值