2017-10-11 25 views
0
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中使用指針有什麼優勢?pointee屬性在swift中做了些什麼?

回答

2

pointee是指針存儲和指向的值。它在早期版本的Swift中曾被稱爲memory。不要在斯威夫特使用指針,除非你絕對必須的,因爲它涉及到你的保留和手動釋放內存:

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爲「H」,這是72,的值UTF8,當我們通過1推進我們然後有一個指針到「e」,這是101,即所述值我們正在通過陣列工作。但是你不希望這樣做,因爲它假定數組中每個項目的內存地址都是連續的,它們可能不是。

有一個更清醒的方法來檢索字節是:

data.withUnsafeBytes { [UInt8](UnsafeBufferPointer(start:$0, count:data.count)) 
} 

或者更好的是:

[UInt8](data) 

正如this post概述。