2012-01-03 47 views
0

每當我使用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中,這樣的問題是:

是否可以使用自定義的字體與核心文本,但只加載必需的字體?

enter image description here

回答

2

的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秒。

+0

'CTFontCreateWithName()'做了魔法! P.S.感謝您澄清映射文件的情況。 – 2012-01-04 08:09:35