Core Text загружает ВСЕ системные шрифты в резидентную память - PullRequest
0 голосов
/ 03 января 2012

Каждый раз, когда я использую 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, поэтому вопрос:

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

enter image description here

1 Ответ

3 голосов
/ 04 января 2012

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

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

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

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

...