Core Text загружает ВСЕ системные шрифты в резидентную память

Всякий раз, когда я использую CTFontCreateWithFontDescriptor() (фрагмент ниже взят из этой статьи)

Я обнаружил, что ВСЕ шрифты сопоставляются и, кажется, теряют около 20 МБ.

dispatch_queue_t queue = dispatch_queue_create("font.worker", NULL);
dispatch_async(queue, ^(void) {
    NSMutableDictionary *attributes = [NSMutableDictionary dictionary];
    [attributes setObject:@"Helvetica" forKey:(id)kCTFontFamilyNameAttribute];
    [attributes setObject:[NSNumber numberWithFloat:36.0f] forKey:(id)kCTFontSizeAttribute];
    CTFontDescriptorRef fontDesc = CTFontDescriptorCreateWithAttributes((CFDictionaryRef)attributes);
    CTFontRef matchingFont = CTFontCreateWithFontDescriptor(fontDesc, 36.0f, NULL);
    CFRelease(matchingFont);
    CFRelease(fontDesc);
});
dispatch_release(queue);

Я слышал, что это исправлено в iOS 5, поэтому вопрос:

Можно ли использовать пользовательский шрифт с основным текстом, но загружать только необходимый шрифт?

введите здесь описание изображения


person vk.edward.li    schedule 03.01.2012    source источник


Ответы (1)


До того, как в iOS 5 было исправлено, что CoreText всегда загружал всю таблицу сопоставления шрифтов при первом поиске шрифта. Это произошло с использованием дескрипторов шрифтов. Если вы устанавливаете шрифт непосредственно по имени, этого не происходит.

В DTCoreText на GitHub https://github.com/Cocoanetics/DTCoreText я работаю над этим, выделяя жирным шрифтом и выделить курсивом имя шрифта, а затем создать шрифт из него.

Обходной путь состоял в том, чтобы инициировать загрузку таблицы сопоставления в фоновой очереди. См.: http://www.cocoanetics.com/2011/04/coretext-loading-performance/ Этот обходной путь больше не нужен с iOS 5. У меня был открыт Radar, и Apple исправила это.

PS: отображаемый файл не использует оперативную память, он просто отображается в адресное пространство для доступа через указатели. Загрузка вызвала еще одну проблему, она заняла 1 секунду на устройстве, вызывая паузу, если она выполнялась в основном потоке.

person Cocoanetics    schedule 04.01.2012
comment
CTFontCreateWithName() сотворил чудо! P.S. Спасибо за разъяснение ситуации с сопоставленным файлом. - person vk.edward.li; 04.01.2012