• 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

  • 相关阅读:
    MarkDownPad 注册码
    ADB server didn't ACK 解决方法
    Python基础教程思维导图笔记
    Java快捷键
    关于chm提示 已取消到该网页的导航的解决方法
    网络基础知识
    将博客搬至CSDN
    hadoop之 yarn (简单了解)
    hadoop之 HDFS 数据I/O(一)
    hadoop 之源码 ResourceManager
  • 原文地址:https://www.cnblogs.com/itlover2013/p/16221284.html
Copyright © 2020-2023  润新知