2017-10-11 10 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は何を表しているのですか、それはデータの次のバイト を指していますか?新しい変数は次のバイトを格納しますか?簡単な方法で簡単にポインタを学習するためのリンクと、スウィフトでポインタを使用するメリットは何ですか?pointeeプロパティは迅速に何をしますか?

答えて

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が72である「H」のUTF8の値であることを期待したい、と私たちは1で進めるとき、私たちはその後、101である「E」の値へのポインタを持っている、すなわち私たちはArrayを使って作業を進めています。しかし、配列内の各項目のメモリアドレスが連続していると仮定しているため、実際にはそうしたくないかもしれません。バイトを検索する

より冷静なアプローチは次のようになります

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

又はよりよくは:

[UInt8](data) 

this postで概説したように。