pointee属性在swift中做了什么?

时间:2017-10-11 12:01:47

标签: swift pointers

    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中使用指针的优点是什么?

1 个答案:

答案 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中所述。