Core Text将所有系统字体加载到Resident Memory中

时间:2012-01-03 11:43:53

标签: ios memory ios4 core-text

每当我使用CTFontCreateWithFontDescriptor()时(从article引用下面的代码段)

我发现所有字体都已映射,似乎浪费了大约20MB。

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 个答案:

答案 0 :(得分:3)

在iOS 5修复之前,CoreText会在您第一次搜索字体时始终加载整个字体映射表。这发生在使用字体描述符。如果您直接按名称对字体进行实例化,则不会发生这种情况。

在GitHub上的DTCoreText https://github.com/Cocoanetics/DTCoreText我正在通过将粗体和斜体本身与字体名称匹配然后从中创建字体来解决这个问题。

解决方法是在后台队列上实例化映射表加载。请参阅:http://www.cocoanetics.com/2011/04/coretext-loading-performance/从iOS 5开始不再需要此解决方法。我打开了Radar,并修复了Apple。

PS:映射文件不使用RAM,它只是映射到地址空间以便通过指针进行访问。加载引起了另一个问题,如果在主线程上完成,它会在设备上花费1秒钟导致暂停。