2017-04-12 4 views
2

CTFontManagerRegisterGraphicsFontが呼び出されたときにメモリリークを受信して​​いる理由がわかりました。それはデバッグビルドなので可能ですか?または、リンゴAPIの間違った使用法と関連していますか?CTFontManagerRegisterGraphicsFontを実行するとメモリリークが発生する

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() 
    } 
} 

アップル楽器:

enter image description here

答えて

3

CTFontManagerRegisterGraphicsFontのパラメータの調査の後、私はerrorパラメータがUnsafeMutablePointer<Unmanaged<CFError>?>?のタイプであることがわかりました。そして、主な問題はUnmanagedタイプと関連しています。

だから、とは何ですか。

オプションのラッパーと同様に、アンマネージドラッパーは、コードと潜在的に不快なクラッシュの間に安全なレイヤー を提供します。 アンマネージドタイプは、メモリが 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) 
     } 

    } 
関連する問題