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