我想知道为什么在调用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()
    }
}
苹果仪器:
ios - 执行CTFontManagerRegisterGraphicsFont时出现内存泄漏-LMLPHP

最佳答案

在研究了CTFontManagerRegisterGraphicsFont的参数之后,我发现error参数是UnsafeMutablePointer<Unmanaged<CFError>?>?的类型。主要问题与Unmanaged类型有关。

那么Unmanaged类型是什么。



什么是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)
        }

    }

10-01 16:02