Objective-C/C++封装C++库时指针引用及int引用参数如何声明调用
Objective-C++ 封装C++函数解决方案
前置要求
你需要将包含该封装代码的文件后缀从.m改为.mm,触发编译器的Objective-C编译模式,才能支持C语法混编。
问题1:pcBuffer参数的对应类型
你之前使用NSString是错误的,pcBuffer是C++侧分配内存的字符缓冲区指针,封装时需要用char指针的引用承接,拿到缓冲区后你可以自行转换为NSData或者NSString使用。如果封装接口需要对外暴露给纯Objective-C代码调用,也可以用二级char指针替代引用类型。
问题2:int引用参数的声明方式
在Objective-C中直接支持C引用语法,如果你仅在ObjC++环境调用该方法,直接用int&声明参数即可;如果需要兼容纯ObjC调用,可以改用int*指针类型,调用时传入变量地址即可。
参考实现
方式1:仅用于ObjC++环境调用的封装
方法声明
// 仅支持ObjC++导入的头文件声明 - (int)getDataWithBuffer:(char*&)pcBuffer bufferSize:(int&)iBufferSize;
方法实现
// .mm实现文件 - (int)getDataWithBuffer:(char*&)pcBuffer bufferSize:(int&)iBufferSize { // 直接调用C++原生函数 return GetData(pcBuffer, iBufferSize); }
调用示例
char* buf = nil; int size = 0; int ret = [self getDataWithBuffer:buf bufferSize:size]; // 示例:将缓冲区转为NSData使用 NSData* data = [NSData dataWithBytes:buf length:size]; // 注意:使用完后必须调用C++库配套的释放接口释放缓冲区,避免内存泄漏,例如: // FreeBuffer(buf);
方式2:兼容纯Objective-C调用的封装
如果你的封装需要暴露给纯.m文件调用,头文件不能出现C++引用语法,可以改为二级指针实现:
方法声明
// 可直接给纯ObjC代码导入的头文件声明 - (int)getDataWithBuffer:(char**)pcBuffer bufferSize:(int*)iBufferSize;
方法实现
// .mm实现文件 - (int)getDataWithBuffer:(char**)pcBuffer bufferSize:(int*)iBufferSize { // 解引用转换为C++引用类型 char*& bufRef = *pcBuffer; int& sizeRef = *iBufferSize; return GetData(bufRef, sizeRef); }
调用示例
char* buf = nil; int size = 0; int ret = [self getDataWithBuffer:&buf bufferSize:&size]; // 后续处理和内存释放逻辑同上
额外注意事项
如果缓冲区存储的是字符串内容,转NSString时需要注意编码匹配,可参考如下写法:
NSString* str = [[NSString alloc] initWithBytes:buf length:size encoding:NSUTF8StringEncoding];
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

