在Swift中创建一个String缓冲区,以供C使用并稍后释放

时间:2019-05-01 08:29:01

标签: c swift ffi

针对那些认识Rust的人的快速问题解答形式:是否有std::ffi::CString的Swift 5等效版本,可以拥有一个String并将其转化为char*,例如{ {3}},然后使用类似into_raw的东西释放/删除它?

长版:

我有一个在Swift中使用的C API。我必须提供一个回调函数,该函数作为闭包参数提供,并且该闭包必须以const char *的形式返回以空值结尾的字符串-在Swift中,其键入为UnsafePointer<Int8>?

很显然,必须有人负责该内存以及何时将其释放。在这种情况下,我想说的是它是堆分配的,并且Swift负责它,它将使const char *保持活动状态,直到C接口完成它并调用某种free()函数为止

在Swift中以UTF-8字符串初始化的分配内存的最痛苦的方法是什么,向C提供一个const char *,然后在有指示时释放它?

1 个答案:

答案 0 :(得分:3)

两个可能的选项:

let swiftString = "Hello world"
swiftString.withCString { cStringPtr in
    // use `cStringPtr` ...

}

使用指针将闭包称为Swift字符串的C字符串表示形式(UTF-8编码)。该指针仅在执行闭包期间有效。

可以延长寿命,

let swiftString = "Hello world"
let cStringPtr = strdup(swiftString)
// use `cStringPtr` ...

从给定的Swift字符串中分配一个新的C字符串,并稍后使用

释放该内存
free(cStringPtr)