Objective-c 混编c++

作者: Jason_风筝 | 来源:发表于2018-12-05 19:00 被阅读39次

    在ios 开发过程中, 可能个别的功能, 库等用c++实现会更好,性能更高,内存开销更少.下面我们来看看OC中怎么调用C++.

    • 首先, C++ 是没有mrc/arc 的概念的, 所以C++的内存自己管理.
    • C++与OC混编的OC代码需要mrc/arc? 这个看你喜欢,个人建议用mrc 会好点.
    • 设置mrc/arc 的环境 或单个文件mrc/arc 的情况
      • 在Build Setting中找到Objective-c Automatic reference counting 设置为YES,整个项目为ARC模式,如果某些文件不使用ARC,可以在Build pyases中的compile source中找到文件设置参数-fno-objc-arc为非ARC模式,反之-fobjc-arc为ARC模式。
    • 如果要两者混编, 需要把.m 文件改成 .mm ,这个OC调用C++ , 如果是C++调用OC把.cpp 改成.mm
    • 注意.h 中不能混编的,因为.h一般是拷贝.我们可以在.h中定义一个struct, 请往下看.

    开始吧

    首先我的结构是
    • 注意 C++_Class.cpp , 要改成C++_Class.mm , 因为里面用到OC.

    OC_Class.h

    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface OC_Class : NSObject
    - (void)OCEat;
    - (void)CPPEat;
    @end
    
    NS_ASSUME_NONNULL_END
    
    

    OC_Class.mm

    #import "OC_Class.h"
    #import "C++_Class.hpp"
    @interface OC_Class() {
        CPP_Class *cppClass;
    }
    
    @end
    
    @implementation OC_Class
    -(id)init
    {
        self = [super init];
        if (self) {
            cppClass = new CPP_Class();
        }
        return self;
    }
    
    -(void)dealloc
    {
        NSLog(@"oc class dealloc");
        delete cppClass;
    }
    - (void)OCEat {
        NSLog(@"call OCEat");
    }
    - (void)CPPEat {
        NSLog(@"call CPPEat");
        cppClass->CPPEat();
    }
    @end
    

    C++_Class.hpp

    #ifndef C___Class_hpp
    #define C___Class_hpp
    
    #include <stdio.h>
    #include <string>
    
    struct OCStruct;
    class CPP_Class {
        OCStruct *ocStruct;
    public:
        CPP_Class();
        ~CPP_Class();
        void CPPEat();
        void OCEat();
    private:
        void initOcStruct();
    };
    
    #endif 
    

    C++_Class.mm

    #include "C++_Class.hpp"
    #import "OC_Class.h"
    #include <iostream>
    
    struct OCStruct {
        OC_Class* ocClass;
    };
    CPP_Class::CPP_Class() {
       
    };
    
    CPP_Class::~CPP_Class() {
        std::cout << "c++ class ~~ deinit " << std::endl;
        if (ocStruct) {
            //[ocStruct->ocClass relase];  //arc的话,忽略它
        }
        delete ocStruct;
    };
    void CPP_Class::initOcStruct() {
        if (!ocStruct) {
            OC_Class* oc = [[OC_Class alloc]init];
            ocStruct = new OCStruct;
            ocStruct->ocClass = oc;
        }
    };
    void CPP_Class::CPPEat() {
        std::cout << "CPPEat////" << std::endl;
        
        this->initOcStruct();
        [this->ocStruct->ocClass OCEat];
    };
    void CPP_Class::OCEat() {
        
        this->initOcStruct();
        [this->ocStruct->ocClass OCEat];
        
    };
    

    使用

    #import "OC_Class.h"
    OC_Class * oc = [[OC_Class alloc]init];
    [oc CPPEat];
    

    相关文章

      网友评论

        本文标题:Objective-c 混编c++

        本文链接:https://www.haomeiwen.com/subject/ttticqtx.html