Я уменьшил проблему утечки до этого легко компилируемого кода, который показывает после 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, чтобы определить, что происходит на самом деле. –
Спасибо. Если я запустил строку 'CGDataProviderRef' в' CFRelease' в 100 циклах итерации, я получу постоянную память 370k, есть ли что-то похожее на цикл GC, который я должен ждать? –
Ну, вы можете обернуть его в блок '@autoreleasepool {}'. Это Objective-C, но может потребоваться в этом случае. Точно так же мне было бы любопытно, если это все еще происходит при вызове из цикла запуска, если вы разрешите выполнение возврата в цикл выполнения. –