2012-03-22 12 views
2

UIFont(of Cocoa-Touch/iOS)がスレッドセーフであるかどうかは誰にでも確認できますか?つまり、メインスレッドの外側にあるスレッド内からの使用は安全ですが、インスタンスはスレッド間で共有されませんか?UIFontスレッドは安全ですか?

問題は私がそれをやっていて、[NSString sizeWithFont:]でランダムクラッシュが発生していて、おそらく私がメインループの外側からUIFontを使用すべきではないと考え始めたことでしょうか?

さらに、Apple's documentation on UIFontは他のスレッドから使​​用できるかどうか疑問に思っています。

allocおよびinitメソッドを使用してUIFontオブジェクトを作成することはありません。その代わりに、UIFontのクラスメソッドを使用して、目的のフォントオブジェクトを検索して取得します。 UIFontどこか記憶されているインスタンスのキャッシュを有しており、インスタンスが誤って複数のスレッドで使用することができ、問題を引き起こす可能性があるので、したがって、メインスレッドの外部からUIFontオブジェクトを使用するのは良い考えではないかもしれないよう

上記宣伝文が鳴り。ヘック、UIFontインスタンスキャッシュは、スレッドの競合の原因になることさえあります。

これに誰かが光を当てることができますか(帰属リンク/証拠あり)?

ありがとうございました

+0

この別のスレッドのUI要素(ラベル、テキストフィールドなど)にもアクセス/変更していますか? –

+0

いいえ、バックグラウンドで一部の文字列のサイズを測定するためにのみ使用します。理由がわからない、ランダムクラッシュが発生しています。とにかく私はその実装をNSAttributedString/CTFontから作られた同等のものに置き換えました。そして、過去の日にその領域にクラッシュはありませんでした。 – adib

+0

興味深いニュース。これは回避策のように聞こえます。 –

答えて

2

rokjarcが正しいです。 フォントUILabelオブジェクトのフォントフォントなどのUI要素のフォントを変更する場合は、メインスレッドで行う必要があります。

しかし、別のスレッドでUIFontインスタンスを作成する場合は、自由に行うことができます。アップルのドキュメントによれば、UIFontは静的メソッドしか提供していません。

関連する問題