私の iOS アプリは iOS 8.2 でクラッシュし、iOS 9 以降では完全に動作します。クラッシュログを確認したところ、以下の関数でクラッシュしていました(NSMutableAttributedString
拡張子に書いてあります)
func changeFont(font: UIFont, range : NSRange, keepFontSize: Bool = false)
{
let traits = font.fontDescriptor().symbolicTraits
let descriptor = baseDescriptor.fontDescriptorWithSymbolicTraits(traits)
let newFont = UIFont(descriptor: descriptor, size: keepFontSize ? descriptor.pointSize : baseDescriptor.pointSize)
self.removeAttribute(NSFontAttributeName, range: range)
self.addAttribute(NSFontAttributeName, value: newFont, range: range) // <- Crash happens here
}
クラッシュログ
*** キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了します。理由: 'NSConcreteMutableAttributedString addAttribute:value:range:: nil value'
その関数で使用されている変数をデバッグしてログに記録すると、descriptor
&newFont
の両方が次のように表示されます<uninitialized>
(lldb) po traits
▿ UIFontDescriptorSymbolicTraits
- rawValue : 268435458
(lldb) po baseDescriptor
UICTFontDescriptor <0x7fc075b574c0> = {
NSFontNameAttribute = CenturyGothic;
NSFontSizeAttribute = 14;
}
(lldb) po descriptor
<uninitialized>
(lldb) po keepFontSize
true
(lldb) po newFont
<uninitialized>
どちらも「 UIFont will not be nil 」というエラーをスローするため、ここで使用if let
または確認することはできません。このクラッシュを修正するにはどうすればよいですか? (または、オブジェクトが初期化されているかどうかを確認するにはどうすればよいですか?) 私のユーザーの大半はまだ iOS 8 を使用しているため、この問題に本当に悩まされています。newFont != nil