【问题标题】:Obj-c(++) calling api with reference to a pointerObj-c(++) 引用指针调用 api
【发布时间】:2021-10-20 08:06:05
【问题描述】:

Objective-C/Objective-C++ 的新手,我正在编写一个 C++ 库的包装器。

其中一个函数采用指针引用和 int 引用来创建缓冲区并返回其大小,以这种方式:

int GetData(char*& pcBuffer, int& iBufferSize);

我真的不清楚如何通过 Objective-C/C++ 与之交互

到目前为止,我一直在写这样的电话

-(int) GetData: (NSString*) pcData
              : (int) iBufferSize;

但是,pcBuffer 引用的指针将由库代码创建和填充,我应该使用什么作为数据类型?

另外,由于 int 是作为引用而不是作为指针传递的,我该如何正确声明呢?

对此有何帮助?

【问题讨论】:

  • 在 obj-c 中只是-(NSString *)GetData
  • 对于任意数据,你应该使用NSData而不是NSString

标签: c++ objective-c pointers reference objective-c++


【解决方案1】:

C++ 函数可能会分配字符串缓冲区并在第一个参数中返回它,同时在第二个参数中返回已分配缓冲区的大小。

您不需要在 Objective-C 端模仿相同的接口,因为您可以使用返回的缓冲区来实例化 NSString。剩下的就是处理函数的返回值,我假设这是一个错误代码,以防出现问题:

- (nullable NSString *)getDataWithError:(NSError **)error {
    char *buffer;
    int size;
    int errCode = GetData(buffer, size);
    if (errCode == 0) {
        return [NSString stringWithCString:buffer encoding:NSUTF8StringEncoding];
    } else {
        if (error) {
            *error = [NSError errorWithDomain:MyErrorDomain code: errCode userInfo:nil];
        }
        return nil;
    }
}

另外,感谢错误报告机制,上面的函数可以很好地从 swift 中调用:

let value = try MyObject().getData()

【讨论】:

    猜你喜欢
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2013-03-20
    相关资源
    最近更新 更多