Swift Language
(安全でない)バッファポインタ
サーチ…
前書き
バッファポインタは、メモリ領域への低レベルアクセスに使用されます。たとえば、アプリケーションとサービス間の効率的な処理とデータ通信のために、バッファポインタを使用することができます。
抜粋:Apple Inc.「Swift with CocoaとObjective-C(Swift 3.1版)を使用する」iBooks。 https://itun.es/us/utTW7.l
リークや未定義の動作を避けるために、バッファポインタを使用して作業しているメモリのライフサイクルを処理する責任があります。
備考
(Unsafe)BufferPointersの理解を完了するために必要な 、密接に連携した概念。
- MemoryLayout( 型のメモリレイアウト 。 サイズ、ストライド、および配置を記述する )
- アンマネージド(アンマネージオブジェクト参照を伝播するための型 )
- UnsafeBufferPointer( メモリ内に連続して格納された要素のバッファへの非所有コレクションインタフェース )
- UnsafeBufferPointerIterator( UnsafeBufferPointerまたはUnsafeMutableBufferPointerインスタンスによって参照されるバッファ内の要素のイテレータ )
- UnsafeMutableBufferPointer( メモリ内に連続して格納された可変要素のバッファへの非所有コレクションインタフェース )
- UnsafeMutablePointer( 特定の型のデータにアクセスして操作するためのポインタ )
- UnsafeMutableRawBufferPointer( メモリ領域内のバイトに対する変更不可能なコレクションインタフェース )
- UnsafeMutableRawBufferPointer.Iterator( ローバッファポインタによって参照されるバイトのイテレータ )
- UnsafeMutableRawPointer( 型なしのデータにアクセスして操作するための生のポインタ )
- UnsafePointer( 特定の型のデータにアクセスするためのポインタ )
- UnsafeRawBufferPointer( メモリ領域内のバイトへの非所有コレクションインターフェイス )
- UnsafeRawBufferPointer.Iterator( ローバッファポインタによって参照されるバイトのイテレータ )
- UnsafeRawPointer( 型なしのデータにアクセスするための生のポインタ )
(Source、 Swiftdoc.org )
UnsafeMutablePointer
struct UnsafeMutablePointer<Pointee>
特定のタイプのデータにアクセスし操作するためのポインタ。
UnsafeMutablePointer型のインスタンスを使用して、メモリ内の特定の型のデータにアクセスします。ポインタがアクセスできるデータのタイプは、ポインターのPointeeタイプです。 UnsafeMutablePointerには、自動メモリ管理やアラインメントの保証はありません。安全ではないポインターを使用して作業しているメモリのライフサイクルを処理して、リークや未定義の動作を回避する必要があります。
手動で管理するメモリは、型なしまたは特定の型にバインドすることができます。 UnsafeMutablePointer型を使用して、特定の型にバインドされたメモリにアクセスして管理します。 ( ソース )
import Foundation
let arr = [1,5,7,8]
let pointer = UnsafeMutablePointer<[Int]>.allocate(capacity: 4)
pointer.initialize(to: arr)
let x = pointer.pointee[3]
print(x)
pointer.deinitialize()
pointer.deallocate(capacity: 4)
class A {
var x: String?
convenience init (_ x: String) {
self.init()
self.x = x
}
func description() -> String {
return x ?? ""
}
}
let arr2 = [A("OK"), A("OK 2")]
let pointer2 = UnsafeMutablePointer<[A]>.allocate(capacity: 2)
pointer2.initialize(to: arr2)
pointer2.pointee
let y = pointer2.pointee[1]
print(y)
pointer2.deinitialize()
pointer2.deallocate(capacity: 2)
元のソースからSwift 3.0に変換されました
バッファポインタの実際の使用例
Swiftライブラリメソッドでの安全でないポインタの使用の解体。
public init?(validatingUTF8 cString: UnsafePointer<CChar>)
目的:
指定されたポインタによって参照されるヌル終了UTF-8データをコピーして検証することによって、新しい文字列を作成します。
この初期化子は、不正な形式のUTF-8コードユニットシーケンスを修復しようとしません。いずれかが見つかると、イニシャライザの結果はnil
ます。次の例では、この初期化子を、2つの異なるCChar
配列の内容へのポインタで呼び出します。最初は整形式のUTF-8コード単位シーケンスで、2番目は整形されていないシーケンスで終了します。
ソースコード、 Apple Inc.、Swift 3ヘッダーファイル (ヘッダーアクセスの場合:プレイグラウンドでは、Cmd + Swiftという単語をクリックします)
import Swift
let validUTF8: [CChar] = [67, 97, 102, -61, -87, 0]
validUTF8.withUnsafeBufferPointer { ptr in
let s = String(validatingUTF8: ptr.baseAddress!)
print(s as Any)
}
// Prints "Optional(Café)"
let invalidUTF8: [CChar] = [67, 97, 102, -61, 0]
invalidUTF8.withUnsafeBufferPointer { ptr in
let s = String(validatingUTF8: ptr.baseAddress!)
print(s as Any)
}
// Prints "nil"
(ソース、Apple Inc.、スウィフトヘッダーファイルの例)