在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];
网友评论