【问题标题】:UTTypeCreatePreferredIdentifierForTag and CFStringRef in SwiftSwift 中的 UTTypeCreatePreferredIdentifierForTag 和 CFStringRef
【发布时间】:2014-10-29 16:22:55
【问题描述】:
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")
    }
}

我收到此错误

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

一行

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

有什么想法吗?谢谢

【问题讨论】:

    标签: swift ios8


    【解决方案1】:

    UTTypeCreatePreferredIdentifierForTag 传回一个Unmanaged<CFStringRef>,因此您需要先从Unmanaged 对象中取出值,然后才能使用它:

    var unmanagedFileUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension, nil)
    var fileUTI = unmanagedFileUTI.takeRetainedValue()
    

    请注意,我调用takeRetainedValue() 是因为UTTypeCreatePreferredIdentifierForTag 返回一个我们负责释放的对象。 takeRetainedValue() 上的 cmets 说:

    将此非托管引用的值作为托管引用获取,然后 消耗它的不平衡保留。

    当函数返回非托管引用并且您 知道您有责任发布结果。

    如果您从一个您确定自己负责释放该对象的函数返回一个Unmanaged 对象,请改为调用takeUnretainedValue()

    【讨论】:

    • takeRetainedValue 与 takeUnretainedValue 的选择仅取决于(据我了解文档)Core Foundation 函数是否返回 (+1) 保留对象。 UTTypeCreatePreferredIdentifierForTag() 的名称中有“Create”,因此根据内存管理规则返回一个 (+1) 保留对象,调用者最终必须释放该保留对象。所以你必须在这里调用takeRetainedValue,否则对象永远不会被释放,你就会有泄漏。
    • 感谢您的全面回答!真的帮了我!
    • @MartinR 你说得对,我误读了 takeUnretainedValue() 上的 cmets 并把它倒过来了。我会解决的...
    • 这里还有一个很清楚的解释:stackoverflow.com/a/29049072/250164
    【解决方案2】:

    我只想提一下我发布的一个小模块,它以更好的方式准确处理这类事情。您的示例将变为:

    import SwiftUTI
    
    func checkFileExtension(fileURL: URL){
    
        let uti = UTI(withExtension: fileURL.pathExtension)
    
        if uti.conforms(to: .image) {
    
            print("image")
        }
    }
    

    可在此处获取:https://github.com/mkeiser/SwiftUTI

    【讨论】:

      猜你喜欢
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多