我有一些原始数据处理要在 iPhone 应用程序中进行。字符串总是来自一个非常大的底层字节数组,所以我希望能够从数组中提取字符串而不会触发内存不足问题。
我可以String(bytesNoCopy: ...)
在文档中看到一个,这是我想要的,以及它应该如何使用。假设调用了一个uint8 数组,data
并且x
是一个数字,显示字符串在数组内的位置。
func readString(_ data:inout [UInt8], _ x:inout Int) -> String {
// Read string length out of data array
let l = Int(readUInt8(&data, &x))
x = x + 1
// Read string out of data array without copy
let s = String(
bytesNoCopy: UnsafeMutableRawPointer, // <-- what goes here??
length: l,
encoding: .utf8,
freeWhenDone: false)
if s == nil {
return ""
}
return s!
}
你可以这样做 -
func readString(_ data:inout [UInt8], _ x:inout Int) -> String {
// Read string length out of data array
let l = Int(readUInt8(&data, &x))
x = x + 1
// Read string out of data array without copy
let dataPointer: UnsafeMutablePointer<UInt8> = UnsafeMutablePointer(mutating: data)
let s = String(
bytesNoCopy: dataPointer, // UNSAFE UNSAFE UNSAFE
length: l,
encoding: .utf8,
freeWhenDone: false)
if s == nil {
return ""
}
return s!
}
该
UnsafeMutableRawPointer
类型不提供自动内存管理、类型安全和对齐保证。您负责通过不安全指针处理您使用的任何内存的生命周期,以避免泄漏或未定义的行为。您手动管理的内存可以是无类型的或绑定到特定类型的。您使用该
UnsafeMutableRawPointer
类型来访问和管理内存中的原始字节,无论该内存是否已绑定到特定类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句