私は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
保持数の確認は信頼できません。とりわけ、 'CFGetRetainCount()' **は(正確に)0 **を返すことはできません。保持カウントがゼロのオブジェクトはありません。オブジェクトは無くなり、定義されていない結果を持つ呼び出しは無効になります。 Allocations and Zombiesの下でプログラムを実行して、実際に起こっていることを判断してください。 –
ありがとうございます。 100回の反復ループで 'CGRelease'に' CGDataProviderRef'行を実行すると、そこに370kの永続メモリがあります。待つべきGCサイクルに似たものがありますか? –
さて、あなたは '@autoreleasepool {}'ブロックでそれをラップすることができます。それはObjective-Cですが、この場合には必要かもしれません。同様に、私はあなたが実行ループに実行を戻すことができれば、実行ループからの呼び出しでこれがまだ起こっているのか不思議です。 –