iOS开发之常用技术点

Objective-c 混编c++

2018-12-05  本文已影响39人  Jason_风筝

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

开始吧

首先我的结构是

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];
上一篇 下一篇

猜你喜欢

热点阅读