簡體   English   中英

Swift 3 - 使用UnsafePointer <CFDictionary>?

[英]Swift 3 - Working with UnsafePointer<CFDictionary>?

我目前正在閱讀Chris Adamson的“學習核心音頻”並嘗試在Swift 3 (而不是Objective-C )中繼續學習。

第一個代碼示例使用AudioTool來收集有關音頻文件的信息。 我的Swift 3版本看起來像這樣:

import Foundation
import AudioToolbox

func main() {
    let arguments = CommandLine.arguments

    guard arguments.count > 1 else {
        print("Usage: CAMetaData /full/path/to/audiofile")
        return
    }

    // Get filepath out of cmd-arguments
    let audiofilePath = NSString(string: arguments[1]).expandingTildeInPath

    // Load audio file into appropriate data structure
    let audioURL = NSURL(fileURLWithPath: audiofilePath)
    var audiofile: AudioFileID? = nil
    var possibleError = noErr

    possibleError = AudioFileOpenURL(audioURL, AudioFilePermissions.readPermission, 0, &audiofile)
    assert(possibleError == noErr)

    // Get size of metadata dictionary
    var outDataSize: UInt32 = 0

    possibleError = AudioFileGetPropertyInfo(audiofile!, kAudioFilePropertyInfoDictionary, &outDataSize, nil)
    assert(possibleError == noErr)

    // Get metadata
    var outDataPointer: UnsafePointer<CFDictionary>? = nil

    possibleError = AudioFileGetProperty(audiofile!, kAudioFilePropertyInfoDictionary, &outDataSize, &outDataPointer)
    assert(possibleError == noErr)

    // How to use this outDataPointer?
    let outData = outDataPointer!.pointee as NSDictionary
    dump(outData)

    // No CFRelease necessary - Swift takes care of that

    // Close connection to audiofile
    possibleError = AudioFileClose(audiofile!)
    assert(possibleError == noErr)
}

main()

一切似乎都很好(所有斷言/ AudioToolbox調用傳遞)。 現在我問自己如何能夠顯示存儲在outDataPointer的數據。

這就是我理解這種情況的方法: outDataPointer包含一個帶有關聯類型UnsafePointer<CFDictionary> 我能夠驗證outDataPointer不是nil ,因此訪問相關值不會導致我的程序崩潰。 outDataPointer!.pointee應該給我一個由outDataPointer背后的關聯值指向的CFDictionary CFDictionary可以轉換為NSDictionary

遺憾的是,傾銷了下層數據

  • __NSAtom#0

到控制台。 不是我所期望的(關於audiofile的信息)。 如何從outDataPointer變量中獲取此數據?

Swift的CFDictionary本身不是一個數據結構; 它是指向數據結構的指針,它等同於Objective-C的CFDictionaryRef 換句話說,它的行為類似於Swift class ,而不是struct

寫入outDataPointer的值不是指向CFDictionary的指針; 一個CFDictionary 您將其解除引用次數太多次,導致存儲在字典中的數據被視為指向字典的指針。 在我的系統上,生成的內存地址為0x001dffffc892e2f1 ,Objective-C將其視為標記指針 ,從而生成NSAtom消息。

要解決此問題, outDataPointer聲明為CFDictionary? 而不是UnsafePointer<CFDictionary>?

// Get metadata
var outDataPointer: CFDictionary? = nil

possibleError = AudioFileGetProperty(audiofile!, kAudioFilePropertyInfoDictionary, &outDataSize, &outDataPointer)
assert(possibleError == noErr)

let outData = outDataPointer! as NSDictionary
dump(outData)

輸出:

▿ 1 key/value pair #0
  ▿ (2 elements)
    - .0: approximate duration in seconds #1
      - super: __NSCFString
        - super: NSMutableString
          - super: NSString
            - super: NSObject
    - .1: 187.387 #2
      - super: NSString
        - super: NSObject

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM