Mas_Tan

Site blog for Tan

No Praise For Colorful


Welcome To My Blog

C++ 调用 OC

iOS 开发中,经常会用OC C++ 混合开发。本篇文章就介绍一下 OC / C++ 的相互调用.

OC => C++

  • 把调用方的文件修改: .m => .mm
  • 引用C++头文件: #include "xxx.h" or #import “xxx.h”
  • 创建对象 CppObject * cppObj = new CppObject();
  • 释放对象 delete cppObj;

OC 调用 C/C++ 就这么简单。注意的是,要记得释放 new 出来的对象,要不然会内存泄漏

C++ => OC

C++ 调用OC 就不是那么简单了,这里我们利用一个 C 函数做桥,将OC 对象转化为 void * 类型的指针传入。

ObjectOC 类如下:

//  ObjectOC.h
#import "ObjectInterface.h"
@interface ObjectOC : NSObject
-(void)doSomething:(void*)parameter;
@property interface call;
@end
--------
//  ObjectOC.m
void OcObjectDoSomethingWith(void* caller, void* parameter){
    [(__bridge id)caller doSomething:parameter];
}
@implementation ObjectOC
-(instancetype)init{
    if ([super init]) {
        _call = OcObjectDoSomethingWith;
    }
    return self;
}
-(void)doSomething:(void *)parameter{
    NSLog(@"%@",parameter);
}
@end

Cpp 文件如下:

// ObjectCpp.h
#include <stdio.h>
#include <iostream>
#include "ObjectInterface.h"

class ObjectCpp {
    void* myOC;
    interface myCall;
public:
    ObjectCpp();
    ObjectCpp(void* oc ,interface call);
    ~ObjectCpp();
    void function(void* parameter);
};

// ObjectCpp.cpp

#include "ObjectCpp.h"
ObjectCpp::ObjectCpp(void* oc, interface call) {
    this->myOC = oc;
    this->myCall = call;
}
void ObjectCpp::function(void* parameter) {
    this->myCall(this->myOC,parameter);
}
ObjectCpp::~ObjectCpp(){
    std::cout<< "CPP Object released"<< std::endl;
}

OC 对象有个 call 属性,是个C函数,且这个函数定义在OC 文件中(OcObjectDoSomethingWith).

ObjectOC * oc = [[ObjectOC alloc]init];
void* point = (__bridge void*)oc;
ObjectCpp* cpp = new ObjectCpp(point,oc.call);
cpp->function((__bridge void*)@"123412");
delete cpp;

pointoc对象的C函数做为 ObjectCpp 的构造函数 的参数. cpp-> function() 方法里,调用了定义好的 C 函数,将OC对象和 parameter 传入。方法就触发到了OC 的文件里。

这样就实现了 C++ 调用 OC 的方法。

Demo 地址

最近的文章

C++ (OC) 内存管理 & 智能指针

前言现在开发的项目中用到了大部分 C++ 代码,由于 Swift 和 C++ 混编不是很方便, 依然选择用 OC 混编, 只需要将 .m 文件 修改为 .mm 文件即可。OC 里的对象大部分都会加入自动释放池中,所以这些都不用手动释放,但是 C++ 对象不会被加入自动释放池,必须要手动释放,否则会造成内存泄漏。 .mm 文件中可以随意的 new CppObject(), 但是要记得 delete 。当cpp指针被当前对象引用时,当前对象的 dealloc 方法里要记得释放该资源。借助这个机...…

继续阅读
更早的文章

Docker docker-compose 配置lnmp开发环境

1 安装Docker本机在CentOs7 下安装Docker,其他平台也一样 首先查看当前内核版本是否高于 3.10$ uname -r3.10.0-327.el7.x86_64//安装docker yum -y install docker//启动dockerservice docker start//查看版本信息docker info安装hello-world 镜像docker run hello-world运行时的输出可以看到docker 是从本地镜像开始找,如果没有该镜像则去Doc...…

继续阅读