我想知道为什么在调用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:
答案 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)
}
}