对于那些了解 Rust 的人来说,问题的快速形式是: 是否有一个相当于 std::ffi::CString
的 Swift 5可以拥有一个 String 并将其转换为 char*
像into_raw然后使用类似 from_raw 来释放/删除它?
更长的版本:
我有一个在 Swift 中使用的 C API。我必须提供一个回调函数,我将其作为闭包参数提供,并且该闭包必须返回一个以 null 结尾的字符串作为 const char *
— 在 Swift 中,输入为 UnsafePointer<Int8>?
.
显然,必须有人对该内存以及何时释放它负责。在这种情况下,我想说它是堆分配的,Swift 负责它,并且它将保留 const char *
一直存在,直到 C 接口(interface)完成它并调用某种 free()
功能。
在用 UTF-8 字符串初始化的 Swift 中分配一些内存的最简单的方法是什么,提供 const char *
到 C,然后根据指示释放它?
最佳答案
两种可能的选择:
let swiftString = "Hello world"
swiftString.withCString { cStringPtr in
// use `cStringPtr` ...
}
使用 Swift 字符串(UTF-8 编码)的 C 字符串表示形式的指针调用闭包。该指针仅在闭包执行期间有效。
为了延长使用生命周期,您可以这样做
let swiftString = "Hello world"
let cStringPtr = strdup(swiftString)
// use `cStringPtr` ...
它从给定的 Swift 字符串中分配一个新的 C 字符串,并稍后释放该内存
free(cStringPtr)
关于在 Swift 中创建一个字符串缓冲区供 C 稍后使用和释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55933537/