我执行CTFontManagerRegisterGraphicsFont时出现内存泄漏

时间:2017-04-12 08:46:21

标签: ios swift memory-leaks

我想知道为什么在调用CTFontManagerRegisterGraphicsFont时我会收到内存泄漏。是否可能,因为它是调试版本?或者它与苹果API的错误使用有关?

public static func register(from url: URL) throws {
    guard let fontDataProvider = CGDataProvider(url: url as CFURL) else {
        throw RegisterFontError(errorMessage: "Could not create font data provider for \(url).")
    }

    let font = CGFont(fontDataProvider)
    var error: Unmanaged<CFError>?
    guard CTFontManagerRegisterGraphicsFont(font, &error) else {
        throw error!.takeUnretainedValue()
    }
}

Apple Instruments:

enter image description here

1 个答案:

答案 0 :(得分:6)

在调查CTFontManagerRegisterGraphicsFont的参数后,我发现error参数的类型为UnsafeMutablePointer<Unmanaged<CFError>?>?。主要问题与Unmanaged类型相关联。

那么什么是Unmanaged类型。

  

Unmanaged包装器,与Optional包装器一样,提供了一层   你的代码和可能令人讨厌的崩溃之间的安全。该   非托管类型存储指针,其内存不受控制   Swift运行时系统。在使用这些数据之前,你需要   这个记忆应该如何生存的责任。

什么是UnsafeMutablePointer

  

UnsafeMutablePointer不提供自动内存管理或   对齐保证。您负责处理生命周期   通过不安全指针处理的任何内存,以避免泄漏或   未定义的行为。

因此可以理解我们应该使用这几行代码来修复我的代码。在我们获取错误描述之后,这将释放error

   public static func register(from url: URL) throws {
        guard let fontDataProvider = CGDataProvider(url: url as CFURL) else {
            throw RegisterFontError(errorMessage: "Could not create font data provider for \(url).")
        }

        let font = CGFont(fontDataProvider)

        var error: Unmanaged<CFError>?
        guard CTFontManagerRegisterGraphicsFont(font, &error) else {
            let message = error.debugDescription
            error?.release()
            throw RegisterFontError.init(errorMessage: message)
        }

    }