一种纯粹的C++回调OC函数/方法的方式

起因

因为在做跨端SDK,语言用的C++,想尽量把C++代码和OC代码解耦,OC调用C++倒是简单,改个源文件的名字为.mm就可以了,C++调OC确定用函数指针,补了下函数指针和函数指针在C++中做入参的知识就写了这样一个简单的Demo,整体是现是:函数指针结合OC的NSNotificationCenter

上代码

OC部分

xx.mm

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    CppInterface * ci = CppInterface::getInstance();
    void (*func)(const char *);
    func = c2oc;
    ci->handlerEvent("c string", func);
}

void c2oc(const char * value) {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"c2oc" object:nil userInfo:@{@"name": @(value)}];
}

- (void)cCallbacy:(NSNotification *)info {
    NSLog(@"from c name is %@ \n", info.userInfo[@"name"]);
}

C++部分

CppInterface.hpp

#ifndef CppInterface_hpp
#define CppInterface_hpp

#include <stdio.h>

using namespace std;

class CppInterface {
public:
    CppInterface();
    ~CppInterface();
    static CppInterface * getInstance();
    void handlerEvent(const char * name, void (*func)(const char *));
};

#endif /* CppInterface_hpp */

CppInterface.cpp

#include "CppInterface.hpp"

CppInterface::CppInterface(){
}

CppInterface::~CppInterface(){
}

void CppInterface::handlerEvent(const char * name, void (*func)(const char *)){
    (*func)(name);
}

CppInterface * CppInterface::getInstance() {
    return new CppInterface();
}

log

 from c name is c string

别忘了手动释放C++的对象