2016-06-22 4 views
1

Objective-Cライブラリのコールバックでこれらのいずれかを受け取っています:UnsafeMutablePointer<UInt8>UnsafeMutablePointer <UInt8>:リスクとは何ですか?

私はそれを解析することができます。私はライブラリーに返信することもできますが、「安全でない」タイプの作業にはどのようなリスクがありますか?これらのリスクを回避するにはどうすればよいですか?また

、Objective-Cのライブラリは、このUnsafeMutablePointer<UInt8>としてスウィフトへの橋渡しuint8_t *を使用している...これはスウィフト相互運用のための最高のものでしょうか?

+1

ObjCライブラリを変更してNSDataを与えることができますか? – kennytm

+1

関連読者:https://www.reddit.com/r/swift/comments/2q1uhr/unsafe_pointers_objective_c/ – JAL

+0

ありがとうございます。@kennytmありがとうございます。「Cの人々にlibを変更するように説得できますか?」私はおそらくそれをラップします。 –

答えて

5

UnsafeMutablePointerは、SwiftでのCポインタの表現方法です。スウィフトポインタが認識されていなくても、ポインタが指し示す基礎となるメモリがいつでも変更できるため、安全ではありません。また、それが指しているメモリブロックのサイズに関する情報もありません(Martinに感謝します)。

ライブラリでCタイプ(この場合はuint8_tへのポインタ)を使用する必要がある場合は、UnsafeMutablePointerを使用する必要があります。それ以外の場合は、数字の配列を表現したいだけなら、NSArrayのタイプのすべてをuint8_tのタイプでラップします(バイトストリームを指している場合はNSData)。

ポインタを逆参照して(非ゼロの場合)、ポインタに保存されている値をSwiftアプリケーションの変数にコピーすることで、これらのリスクを回避できます。

+0

ありがとうございました、それは疑問でした。 –

+0

私の知らないうちに、私は基本的にそれが何らかの形で漏れを起こすのではないかと心配していました。 –

+3

また、ポインターが指すメモリブロックの*サイズ*に関する情報がポインタにないため、安全ではなく、無効なメモリ位置にポインタで簡単にアクセスできます。 –

関連する問題