我想知道为什么在调用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()
}
}
苹果仪器:最佳答案
在研究了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)
}
}