5

非推奨になったコードの行があります.XCodeにはそれを置き換える提案がありますが、違いを理解することはできません.これらは機能した私の3行です:

let path = NSBundle.mainBundle().pathForResource("example", ofType: ".p12")
let pkcs12Data = NSData.dataWithContentsOfMappedFile(path!)
let cf: CFDataRef = pkcs12Data as! CFDataRef

警告と提案に従って、コードを次のように変更しました。

let path = NSBundle.mainBundle().pathForResource("example", ofType: ".p12")
let pkcs12Data = NSData(contentsOfFile: path!)
let cf: CFDataRef = pkcs12Data as! CFDataRef

エラーが発生します:

EXC_BAD_INSTRUCTION (CODE=EXC_I386_INVOP SUBCODE=0x0)
4

3 に答える 3

10

少し安全なバージョン:

guard
    let url = NSBundle.mainBundle().URLForResource("example", withExtension: ".p12"),
    let data = NSData(contentsOfURL: url)
    else { // Do something because you couldn't get the file or convert it to NSData }

    let dataPtr = CFDataCreate(kCFAllocatorDefault, UnsafePointer<UInt8>(data.bytes), data.length)

文字列パスの代わりにファイルベースの URL を使用することに注意してください。

呼び出すルーチンを決定するときは、文字列を使用してパスを指定するルーチンよりも、NSURL オブジェクトを使用してパスを指定できるルーチンを選択してください。URL ベースのルーチンのほとんどは、OS X v10.6 以降で導入され、Grand Central Dispatch などのテクノロジーを利用するように最初から設計されました。これにより、多くの作業を必要とせずに、マルチコア コンピューターでコードをすぐに活用できます。

ファイルシステムプログラミングガイドより

于 2015-10-01T09:38:44.880 に答える
4

@Abizernの答えは機能しますが、CFDataCreateWithBytesNoCopy代わりに使用するCFDataCreateとより効果的です。

于 2015-11-19T03:46:20.773 に答える