CGFontCreateWithDataProviderで固まるバグの対処方法(objective-c)

公開: 2013-06-08 14:32
更新: 2016-04-29 06:02
こんにちは♪
最近は寝てる時間以外の90%近くをパソコンの
画面を見て過ごしているあっきぃさんもといひっきぃさんです。よろぴこっ♪

iPhoneアプリの話なんですが、
フォントファイルってあるじゃないですか。
hogehoge.otfとかmukimuki.ttfとかとかとか。

アプリによっては
色々なフォントが使えるとかわいいですよね。
しかしフォントファイルは思いのほか重いのです。

きゃぁー、これもかわいいー
おお、これなんかカッコいいなー
なぁんてほいほいXcodeちゃんに組み込んでいったらあっという間に50MB超えてしまう...
(50MBを超えるとユーザーはwifi環境でないとインストール出来なくなってしまう。

そこでフォントファイルをダウンロードして読み込めばいいのだっ

ってな発想になるわけですね♪
例えばこのアプリ
ダウンロードしたフォントファイルを
ドキュメント下とかに置いといて、#import <CoreText/CoreText.h>して
//pathはダウンロードしたフォントファイルまでのpath
NSData *data = [[NSFileManager defaultManager] contentsAtPath:path];
@try {
        CFErrorRef error;
        CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
        CGFontRef font = CGFontCreateWithDataProvider(provider);
        if(!CTFontManagerRegisterGraphicsFont(font, &error)){
                CFStringRef errorDescription = CFErrorCopyDescription(error);
                CFRelease(errorDescription);
        }
        CFRelease(font);
        CFRelease(provider);
}
@catch (NSException *exception) {
        NSLog(@"このフォントはもう...もう...");
}
的な感じで読み込みが出来るわけでーす♪
なるほどふふふーん♪

じゃぁこれをAppDelegateとかで起動時に走らせればいいかなー
と思ったのですが、何故か固まるという...

なぜ...
なぜなの...?!
落ちるとかではなく完全なるフリーズ

ダウンロードしたフォントファイルが壊れているのかっ。
日頃の行いが悪いのかっ。とかなんとか思ったんですが違うみたい。

解決方法としては読み込む前に一行足すだけ。
[UIFont systemFontOfSize:10];
読み込む前に一度でもUIFont系を実行しないとだめみたい。
UIFont系を呼び出した時に始めてXcodeに組み込んであるフォントファイルとかも読み込むようで、そこらへんと関係してる気がする。

はまっている方に参考になればと♪

ではでは♪

この記事をシェア
この記事にコメントする
書き込む
あっきぃ(@appstars_aki)
Web、iOSなフリーランサーです。好きなものはお寿司です。でもお寿司は高いので普段は雑草とか拾ったドングリを食べています。お仕事や意味もなく毎月お小遣いをくれる人を探してます。

お仕事の依頼や自分で作ったアプリのレビューを希望しちゃう方はaki@appstars.jpまでご連絡ください。