let data = Data()
data.withUnsafeBytes { (uPtr: UnsafePointer<UInt8>) in
var ptr = uPtr
var j = ptr.pointee
var new = ptr.advanced(by: 1)
}
j
在此处表示或存储的内容是指向下一个字节
的数据?新变量会存储下一个字节吗?在Swift中以更简单的方式学习指针的任何链接以及在Swift中使用指针的优点是什么?
答案 0 :(得分:2)
pointee
是指针存储和指向的值。它曾经在早期版本的Swift中被称为memory
。除非你绝对必须,否则不要在Swift中使用指针,因为它涉及你手动保留和释放内存:
UnsafePointer不提供自动内存管理或对齐 担保。您有责任处理任何生命周期 你通过不安全的指针工作的内存,以避免泄漏或 未定义的行为。
在您的示例中,您没有数据,但如果您有数据,则第一个指针首先指向数据数组中第一个值的内存地址,例如
var str = "Hello, playground"
guard let data = str.data(using: .utf8) else {fatalError()}
data.withUnsafeBytes { (uPtr: UnsafePointer<UInt8>) in
let ptr = uPtr
ptr.pointee // 72
let ptr2 = ptr.advanced(by: 1)
ptr2.pointee // 101
}
所以我们希望ptr.pointee
成为&#34; H&#34;的&ut;这是72,当我们前进1时,我们有一个指向&#34; e&#34;的值的指针。这是101,即我们正在通过阵列工作。但是你不想实际这样做,因为它假设数组中每个项目的内存地址是连续的,它们可能不是。
检索字节的更清醒的方法是:
data.withUnsafeBytes { [UInt8](UnsafeBufferPointer(start:$0, count:data.count))
}
或更好:
[UInt8](data)
如this post中所述。