以编程方式加载自定义字体时的内存问题

时间:2015-04-02 05:42:03

标签: ios

我想创建一个包装所有资源的框架。特别是,我需要加载一些自定义字体。

有两种方法:

  1. 以编程方式加载。
  2. 我使用以下代码加载从bundle中读取的字体数据:

    + (void)loadFontData:(NSData*)inData {
        CFErrorRef error;
        CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)inData);
        CGFontRef font = CGFontCreateWithDataProvider(provider);
        if (! CTFontManagerRegisterGraphicsFont(font, &error)) {
            CFStringRef errorDescription = CFErrorCopyDescription(error);
            NSLog(@"Failed to load font: %@", errorDescription);
            CFRelease(errorDescription);
        }
        CFRelease(font);
        CFRelease(provider);
    }
    

    并运行

    中的代码
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
    

    但是,我发现应用程序启动时内存使用量显着增加,有时我会收到内存警告。

    1. 在项目的plist中添加由应用程序提供的字体值。
    2. 这种方式是添加客户字体的常用方法。但是,如果使用这种方式,我必须公开我的框架细节。例如,我必须添加以下值:

      enter image description here

      此方法不会导致内存峰值。但我想隐藏使用我的框架的人的字体文件。

      有人可以帮忙吗?如何以编程方式加载自定义字体而不会导致内存使用爆炸?

1 个答案:

答案 0 :(得分:0)

这样做可以避免增加进程的内存使用量。

bool CTFontManagerRegisterFontsForURL(CFURLRef fontURL, CTFontManagerScope scope, CFErrorRef  _Nullable *error);

Apple文档说:

  

文件支持的字体应使用CTFontManagerRegisterFontsForURL注册。