2016-11-25 14 views
0

私はCTFontCreateWithGraphicsFontを使用してリリースした後にct_fontのコードをコンパイルするこの簡単なコードにリークの問題を減らして、cg_fontの余分な参照が残されます。これは内部的なAppleのリファレンスカウントの問題ですか、それとも、リリースの順序を変更するとcg_fontをダブルリリースする必要があるのですか?ありがとう。CTFontCreateWithGraphicsFontでメモリリークを回避するには?

#include <stdio.h> 
#include <stdlib.h> 
#include <ApplicationServices/ApplicationServices.h> 

int main(int argc, char **argv) { 
    FILE *f = fopen("/Library/Fonts/Tahoma.ttf", "rb"); 
    fseek(f, 0, SEEK_END); 
    long fsize = ftell(f); 
    fseek(f, 0, SEEK_SET); 

    char* font = (char*)malloc(fsize); 
    fread(font, fsize, 1, f); 
    fclose(f); 

    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, font, fsize, NULL); 
    CGFontRef cg_font = CGFontCreateWithDataProvider(provider); 
    CTFontRef ct_font = CTFontCreateWithGraphicsFont(cg_font, 36., NULL, NULL); 
    CGDataProviderRelease(provider); 

    // 

    CFRelease(ct_font); 
    CFRelease(cg_font); 

    printf("ct_font: %d\ncg_font: %d\n", (int)CFGetRetainCount(ct_font), (int)CFGetRetainCount(cg_font)); 

    free(font); 

    return 0; 
} 

結果が出た後、コンパイルおよび実行します。

ct_font:-1

cg_font:1

+1

保持数の確認は信頼できません。とりわけ、 'CFGetRetainCount()' **は(正確に)0 **を返すことはできません。保持カウントがゼロのオブジェクトはありません。オブジェクトは無くなり、定義されていない結果を持つ呼び出しは無効になります。 Allocations and Zombiesの下でプログラムを実行して、実際に起こっていることを判断してください。 –

+0

ありがとうございます。 100回の反復ループで 'CGRelease'に' CGDataProviderRef'行を実行すると、そこに370kの永続メモリがあります。待つべきGCサイクルに似たものがありますか? –

+0

さて、あなたは '@autoreleasepool {}'ブロックでそれをラップすることができます。それはObjective-Cですが、この場合には必要かもしれません。同様に、私はあなたが実行ループに実行を戻すことができれば、実行ループからの呼び出しでこれがまだ起こっているのか不思議です。 –

答えて

2

CGFontTInMemoryBaseFontコンストラクタで起こる保持:

#0 0x00007fff8928e4d0 in CFRetain() 
#1 0x00007fff86472906 in TInMemoryBaseFont::TInMemoryBaseFont(CGFont*)() 
#2 0x00007fff864728b8 in CTFontDescriptor::CTFontDescriptor(CGFont*, is_inmemory_t const&)() 
#3 0x00007fff8646cb30 in TDescriptorSource::CopyDescriptor(CGFont*, __CFDictionary const*) const() 
#4 0x00007fff8646c99a in TFont::InitDescriptor(CGFont*, __CTFontDescriptor const*)() 
#5 0x00007fff8646c7b4 in TFont::TFont(CGFont*, double, CGAffineTransform const*, __CTFontDescriptor const*)() 
#6 0x00007fff8646c775 in CTFontCreateWithGraphicsFont() 

のリリース時のリリースと一致しません。これはおそらくTInMemoryBaseFontデストラクタが呼び出されない(不明な理由により)ためです。

これは解決策ではありませんが、誰かが問題をさらにデバッグするのに役立つかもしれません。

+0

それを調査してくれてありがとう:) –

関連する問題