在 Swift 中创建一个字符串缓冲区供 C 使用并稍后释放
Create a String buffer in Swift for C to consume and free later
对于那些了解 Rust 的人的问题的快速形式: 是否有 Swift 5 等价于 std::ffi::CString
可以拥有一个 String 并将其转换变成 char*
比如 into_raw and later free/drop it using something like from_raw?
更长的版本:
我有一个 C API,我正在 Swift 消费。我必须提供一个回调函数,我将其作为闭包参数提供,并且该闭包必须 return 一个空终止字符串作为 const char *
——在 Swift 中,它被键入为 UnsafePointer<Int8>?
.
显然必须有人负责该内存以及何时释放它。在这种情况下,我想说它是堆分配的,并且 Swift 负责它并且它将保持 const char *
活动直到 C 接口完成它并调用某种 free()
函数。
在使用 UTF-8 字符串初始化的 Swift 中分配一些内存,向 C 提供 const char *
,然后在收到指令后释放它的最简单的方法是什么?
两个可能的选择:
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)
对于那些了解 Rust 的人的问题的快速形式: 是否有 Swift 5 等价于 std::ffi::CString
可以拥有一个 String 并将其转换变成 char*
比如 into_raw and later free/drop it using something like from_raw?
更长的版本:
我有一个 C API,我正在 Swift 消费。我必须提供一个回调函数,我将其作为闭包参数提供,并且该闭包必须 return 一个空终止字符串作为 const char *
——在 Swift 中,它被键入为 UnsafePointer<Int8>?
.
显然必须有人负责该内存以及何时释放它。在这种情况下,我想说它是堆分配的,并且 Swift 负责它并且它将保持 const char *
活动直到 C 接口完成它并调用某种 free()
函数。
在使用 UTF-8 字符串初始化的 Swift 中分配一些内存,向 C 提供 const char *
,然后在收到指令后释放它的最简单的方法是什么?
两个可能的选择:
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)