起因
因为在做跨端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++的对象
网友评论