Swift中的UTTypeCreatePreferredIdentifierForTag和CFStringRef

pbe*_*beo 8 swift ios8

import Foundation
import MobileCoreServices

func checkFileExtension(fileName: NSString){
    println(fileName)

    var fileExtension:CFStringRef = fileName.pathExtension

    println(fileExtension)

    var fileUTI:CFStringRef = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, nil)

    println(fileUTI)

    let testBool = UTTypeConformsTo(fileUTI, kUTTypeImage) != 0

    if  testBool{
        println("image")
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

错误:'Unmanaged'不能转换为'CFStringRef'

在线

var fileUTI:CFStringRef = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension,fileExtension,nil)

有任何想法吗 ??谢谢

Mik*_*e S 22

UTTypeCreatePreferredIdentifierForTag传回一个Unmanaged<CFStringRef>,所以你需要先从Unmanaged对象中获取值才能使用它:

var unmanagedFileUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, nil)
var fileUTI = unmanagedFileUTI.takeRetainedValue()
Run Code Online (Sandbox Code Playgroud)

请注意,我正在调用,takeRetainedValue()因为UTTypeCreatePreferredIdentifierForTag它返回了一个我们负责释放的对象.评论takeRetainedValue()说:

获取此非托管引用的值作为托管引用,并消耗它的不平衡保留.

当函数返回非托管引用并且您知道自己负责释放结果时,这非常有用.

如果Unmanaged从一个函数中获取一个对象,并且您确定负责释放该对象,请调用它takeUnretainedValue().

  • takeRetainedValue vs takeUnretainedValue的选择仅取决于(据我理解的文档)Core Foundation函数是否返回(+1)保留对象.UTTypeCreatePreferredIdentifierForTag()在其名称中具有"Create",因此根据内存管理规则返回调用者必须最终释放的(+1)保留对象.所以你必须在这里调用takeRetainedValue,否则对象永远不会被释放而你有泄漏. (9认同)
  • 比较https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html中的"创建规则". (2认同)